2024-05-01 12:21:07,638 [ 188256 ] INFO : ClickHouse root is not set. Will use /home/ubuntu/_work/_temp/test/git-repo-copy (runner:42, check_args_and_update_paths) 2024-05-01 12:21:07,639 [ 188256 ] INFO : Cases dir is not set. Will use /home/ubuntu/_work/_temp/test/git-repo-copy/tests/integration (runner:90, check_args_and_update_paths) 2024-05-01 12:21:07,639 [ 188256 ] INFO : src dir is not set. Will use /home/ubuntu/_work/_temp/test/git-repo-copy/src (runner:97, check_args_and_update_paths) 2024-05-01 12:21:07,639 [ 188256 ] INFO : base_configs_dir: /home/ubuntu/_work/_temp/test/git-repo-copy/programs/server, binary: /home/ubuntu/_work/_temp/test/build/clickhouse, cases_dir: /home/ubuntu/_work/_temp/test/git-repo-copy/tests/integration (runner:99, check_args_and_update_paths) 2024-05-01 12:21:07,639 [ 188256 ] INFO : Unknown image altinityinfra/dotnet-client (runner:357, ) Running pytest container as: 'docker run --rm --name clickhouse_integration_tests_5g4oxp --privileged --dns-search='.' --volume=/home/ubuntu/_work/_temp/test/build/clickhouse-odbc-bridge:/clickhouse-odbc-bridge --volume=/home/ubuntu/_work/_temp/test/build/clickhouse:/clickhouse --volume=/home/ubuntu/_work/_temp/test/build/clickhouse-library-bridge:/clickhouse-library-bridge --volume=/home/ubuntu/_work/_temp/test/git-repo-copy/programs/server:/clickhouse-config --volume=/home/ubuntu/_work/_temp/test/git-repo-copy/tests/integration:/ClickHouse/tests/integration --volume=/home/ubuntu/_work/_temp/test/git-repo-copy/src/Server/grpc_protos:/ClickHouse/src/Server/grpc_protos --volume=/run:/run/host:ro --mount type=bind,source=/home/ubuntu/_work/_temp/test/dockerd_volume_dir,target=/var/lib/docker -e DOCKER_HELPER_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_BASE_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_KERBERIZED_HADOOP_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_KERBEROS_KDC_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_GOLANG_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_JAVA_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_JS_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_PHP_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_NGINX_DAV_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_POSTGRESQL_JAVA_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_CLIENT_TIMEOUT=300 -e COMPOSE_HTTP_TIMEOUT=600 -e PYTHONUNBUFFERED=1 -e PYTEST_ADDOPTS="--dist=loadfile -n 10 -rfEps --run-id=0 --color=no --durations=0 test_keeper_persistent_log_multinode/test.py::test_restart_multinode test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader test_keeper_secure_client/test.py::test_connection test_library_bridge/test_exiled.py::test_bridge_dies_with_parent test_log_levels_update/test.py::test_log_levels_update test_merge_tree_load_parts/test.py::test_merge_tree_load_parts test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error 'test_merge_tree_s3/test.py::test_alter_table_columns[node]' 'test_merge_tree_s3/test.py::test_attach_detach_partition[node]' 'test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk]' 'test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node]' 'test_merge_tree_s3/test.py::test_freeze_unfreeze[node]' 'test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node]' 'test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node]' 'test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node]' 'test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node]' 'test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node]' 'test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node]' 'test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node]' 'test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node]' 'test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node]' 'test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node]' 'test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node]' 'test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node]' 'test_merge_tree_s3/test.py::test_s3_no_delete_objects[node]' 'test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node]' 'test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node]' 'test_merge_tree_s3/test.py::test_table_manipulations[node]' 'test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2]' 'test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1]' 'test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2]' 'test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1]' test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree test_partition/test.py::test_attach_check_all_parts test_partition/test.py::test_cannot_attach_active_part test_partition/test.py::test_detached_part_dir_exists test_partition/test.py::test_drop_detached_parts test_partition/test.py::test_make_clone_in_detached test_partition/test.py::test_partition_complex test_partition/test.py::test_partition_simple test_partition/test.py::test_system_detached_parts test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed test_postgresql_protocol/test.py::test_java_client test_postgresql_protocol/test.py::test_psql_client test_postgresql_protocol/test.py::test_python_client test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions test_postgresql_replica_database_engine_1/test.py::test_different_data_types test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries test_postgresql_replica_database_engine_1/test.py::test_multiple_databases test_postgresql_replica_database_engine_1/test.py::test_quoting_1 test_postgresql_replica_database_engine_1/test.py::test_quoting_2 test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index test_postgresql_replica_database_engine_1/test.py::test_replicating_dml test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished test_postgresql_replica_database_engine_1/test.py::test_single_transaction test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots test_postgresql_replica_database_engine_1/test.py::test_virtual_columns test_quota/test.py::test_add_remove_interval test_quota/test.py::test_add_remove_quota test_quota/test.py::test_consumption_of_show_clusters test_quota/test.py::test_consumption_of_show_databases test_quota/test.py::test_consumption_of_show_privileges test_quota/test.py::test_consumption_of_show_processlist test_quota/test.py::test_consumption_of_show_tables test_quota/test.py::test_dcl_introspection test_quota/test.py::test_dcl_management test_quota/test.py::test_exceed_quota test_quota/test.py::test_query_inserts test_quota/test.py::test_quota_from_users_xml test_quota/test.py::test_reload_users_xml_by_timer test_quota/test.py::test_simpliest_quota test_quota/test.py::test_tracking_quota test_quota/test.py::test_users_xml_is_readonly test_reloading_settings_from_users_xml/test.py::test_force_reload test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout test_render_log_file_name_templates/test.py::test_check_file_names test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table -vvv" altinityinfra/integration-tests-runner:0-8e9be16153250c8307730c9b88c8517181f494ce '. Start tests ============================= test session starts ============================== platform linux -- Python 3.10.12, pytest-7.4.4, pluggy-1.5.0 -- /usr/bin/python3 cachedir: .pytest_cache rootdir: /ClickHouse/tests/integration configfile: pytest.ini plugins: xdist-3.5.0, repeat-0.9.3, random-0.2, order-1.0.1, timeout-2.2.0 timeout: 900.0s timeout method: signal timeout func_only: False created: 10/10 workers 10 workers [100 items] scheduling tests via LoadFileScheduling test_merge_tree_s3/test.py::test_alter_table_columns[node] test_merge_tree_load_parts/test.py::test_merge_tree_load_parts test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication test_quota/test.py::test_add_remove_interval test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2] test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node test_postgresql_protocol/test.py::test_java_client test_reloading_settings_from_users_xml/test.py::test_force_reload test_partition/test.py::test_attach_check_all_parts [gw4] [ 1%] PASSED test_reloading_settings_from_users_xml/test.py::test_force_reload test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout [gw2] [ 2%] PASSED test_partition/test.py::test_attach_check_all_parts test_partition/test.py::test_cannot_attach_active_part [gw8] [ 3%] PASSED test_postgresql_protocol/test.py::test_java_client test_postgresql_protocol/test.py::test_psql_client [gw2] [ 4%] PASSED test_partition/test.py::test_cannot_attach_active_part test_partition/test.py::test_detached_part_dir_exists [gw8] [ 5%] PASSED test_postgresql_protocol/test.py::test_psql_client test_postgresql_protocol/test.py::test_python_client [gw8] [ 6%] PASSED test_postgresql_protocol/test.py::test_python_client [gw4] [ 7%] PASSED test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum [gw5] [ 8%] PASSED test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2] test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1] [gw9] [ 9%] PASSED test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed [gw9] [ 10%] PASSED test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed [gw2] [ 11%] PASSED test_partition/test.py::test_detached_part_dir_exists test_partition/test.py::test_drop_detached_parts [gw3] [ 12%] PASSED test_quota/test.py::test_add_remove_interval test_quota/test.py::test_add_remove_quota [gw4] [ 13%] PASSED test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int [gw4] [ 14%] PASSED test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload [gw5] [ 15%] PASSED test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1] test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2] [gw4] [ 16%] PASSED test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout [gw2] [ 17%] PASSED test_partition/test.py::test_drop_detached_parts test_partition/test.py::test_make_clone_in_detached [gw5] [ 18%] PASSED test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2] test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1] test_keeper_persistent_log_multinode/test.py::test_restart_multinode [gw4] [ 19%] PASSED test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout [gw3] [ 20%] PASSED test_quota/test.py::test_add_remove_quota test_quota/test.py::test_consumption_of_show_clusters [gw3] [ 21%] PASSED test_quota/test.py::test_consumption_of_show_clusters test_quota/test.py::test_consumption_of_show_databases [gw5] [ 22%] PASSED test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1] test_library_bridge/test_exiled.py::test_bridge_dies_with_parent [gw3] [ 23%] PASSED test_quota/test.py::test_consumption_of_show_databases test_quota/test.py::test_consumption_of_show_privileges [gw2] [ 24%] PASSED test_partition/test.py::test_make_clone_in_detached test_partition/test.py::test_partition_complex [gw3] [ 25%] PASSED test_quota/test.py::test_consumption_of_show_privileges test_quota/test.py::test_consumption_of_show_processlist [gw3] [ 26%] PASSED test_quota/test.py::test_consumption_of_show_processlist test_quota/test.py::test_consumption_of_show_tables [gw2] [ 27%] PASSED test_partition/test.py::test_partition_complex test_partition/test.py::test_partition_simple [gw0] [ 28%] PASSED test_merge_tree_s3/test.py::test_alter_table_columns[node] test_merge_tree_s3/test.py::test_attach_detach_partition[node] [gw3] [ 29%] PASSED test_quota/test.py::test_consumption_of_show_tables test_quota/test.py::test_dcl_introspection [gw2] [ 30%] PASSED test_partition/test.py::test_partition_simple test_partition/test.py::test_system_detached_parts [gw6] [ 31%] PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where [gw6] [ 32%] PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where [gw0] [ 33%] PASSED test_merge_tree_s3/test.py::test_attach_detach_partition[node] test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk] [gw3] [ 34%] PASSED test_quota/test.py::test_dcl_introspection test_quota/test.py::test_dcl_management test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 [gw6] [ 35%] PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree [gw3] [ 36%] PASSED test_quota/test.py::test_dcl_management test_quota/test.py::test_exceed_quota [gw2] [ 37%] PASSED test_partition/test.py::test_system_detached_parts [gw6] [ 38%] PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree [gw3] [ 39%] PASSED test_quota/test.py::test_exceed_quota test_quota/test.py::test_query_inserts [gw7] [ 40%] PASSED test_merge_tree_load_parts/test.py::test_merge_tree_load_parts test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted test_log_levels_update/test.py::test_log_levels_update [gw4] [ 41%] PASSED test_library_bridge/test_exiled.py::test_bridge_dies_with_parent [gw3] [ 42%] PASSED test_quota/test.py::test_query_inserts test_quota/test.py::test_quota_from_users_xml test_render_log_file_name_templates/test.py::test_check_file_names [gw1] [ 43%] PASSED test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication [gw9] [ 44%] PASSED test_keeper_persistent_log_multinode/test.py::test_restart_multinode [gw3] [ 45%] PASSED test_quota/test.py::test_quota_from_users_xml test_quota/test.py::test_reload_users_xml_by_timer test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication test_keeper_secure_client/test.py::test_connection [gw3] [ 46%] PASSED test_quota/test.py::test_reload_users_xml_by_timer test_quota/test.py::test_simpliest_quota [gw3] [ 47%] PASSED test_quota/test.py::test_simpliest_quota test_quota/test.py::test_tracking_quota [gw3] [ 48%] PASSED test_quota/test.py::test_tracking_quota test_quota/test.py::test_users_xml_is_readonly [gw7] [ 49%] PASSED test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error [gw3] [ 50%] PASSED test_quota/test.py::test_users_xml_is_readonly [gw7] [ 51%] SKIPPED test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error [gw4] [ 52%] PASSED test_render_log_file_name_templates/test.py::test_check_file_names [gw9] [ 53%] PASSED test_keeper_secure_client/test.py::test_connection [gw5] [ 54%] PASSED test_log_levels_update/test.py::test_log_levels_update test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility [gw8] [ 55%] PASSED test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 [gw1] [ 56%] PASSED test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value [gw1] [ 57%] PASSED test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader [gw1] [ 58%] PASSED test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions [gw5] [ 59%] PASSED test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility [gw1] [ 60%] PASSED test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions test_postgresql_replica_database_engine_1/test.py::test_different_data_types [gw1] [ 61%] PASSED test_postgresql_replica_database_engine_1/test.py::test_different_data_types test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished [gw8] [ 62%] PASSED test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader [gw9] [ 63%] PASSED test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table [gw0] [ 64%] PASSED test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk] test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node] [gw0] [ 65%] PASSED test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node] test_merge_tree_s3/test.py::test_freeze_unfreeze[node] [gw0] [ 66%] PASSED test_merge_tree_s3/test.py::test_freeze_unfreeze[node] test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node] [gw1] [ 67%] PASSED test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables [gw1] [ 68%] PASSED test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables [gw0] [ 69%] FAILED test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node] test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node] [gw1] [ 70%] PASSED test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries [gw0] [ 71%] PASSED test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node] test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node] [gw0] [ 72%] PASSED test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node] test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node] [gw1] [ 73%] PASSED test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries test_postgresql_replica_database_engine_1/test.py::test_multiple_databases [gw0] [ 74%] PASSED test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node] test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node] [gw1] [ 75%] PASSED test_postgresql_replica_database_engine_1/test.py::test_multiple_databases test_postgresql_replica_database_engine_1/test.py::test_quoting_1 [gw1] [ 76%] PASSED test_postgresql_replica_database_engine_1/test.py::test_quoting_1 test_postgresql_replica_database_engine_1/test.py::test_quoting_2 [gw1] [ 77%] PASSED test_postgresql_replica_database_engine_1/test.py::test_quoting_2 test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index [gw1] [ 78%] PASSED test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index test_postgresql_replica_database_engine_1/test.py::test_replicating_dml [gw1] [ 79%] PASSED test_postgresql_replica_database_engine_1/test.py::test_replicating_dml test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished [gw1] [ 80%] PASSED test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished test_postgresql_replica_database_engine_1/test.py::test_single_transaction [gw1] [ 81%] PASSED test_postgresql_replica_database_engine_1/test.py::test_single_transaction test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes [gw1] [ 82%] PASSED test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots [gw1] [ 83%] PASSED test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots test_postgresql_replica_database_engine_1/test.py::test_virtual_columns [gw1] [ 84%] PASSED test_postgresql_replica_database_engine_1/test.py::test_virtual_columns [gw0] [ 85%] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node] test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3] [gw0] [ 86%] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3] test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part] [gw0] [ 87%] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part] test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node] [gw0] [ 88%] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node] test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node] [gw0] [ 89%] PASSED test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node] test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node] [gw0] [ 90%] PASSED test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node] test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node] [gw0] [ 91%] PASSED test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node] test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node] [gw0] [ 92%] PASSED test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node] test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node] [gw0] [ 93%] PASSED test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node] test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node] [gw0] [ 94%] SKIPPED test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node] test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node] [gw0] [ 95%] SKIPPED test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node] test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node] [gw0] [ 96%] SKIPPED test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node] test_merge_tree_s3/test.py::test_s3_no_delete_objects[node] [gw0] [ 97%] PASSED test_merge_tree_s3/test.py::test_s3_no_delete_objects[node] test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node] [gw0] [ 98%] PASSED test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node] test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node] [gw0] [ 99%] PASSED test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node] test_merge_tree_s3/test.py::test_table_manipulations[node] [gw0] [100%] PASSED test_merge_tree_s3/test.py::test_table_manipulations[node] =================================== FAILURES =================================== _________________ test_heavy_insert_select_check_memory[node] __________________ [gw0] linux -- Python 3.10.12 /usr/bin/python3 cluster = broken_s3 = node_name = 'node' @pytest.mark.parametrize("node_name", ["node"]) def test_heavy_insert_select_check_memory(cluster, broken_s3, node_name): node = cluster.instances[node_name] node.query( """ CREATE TABLE central_query_log ( control_plane_id UUID, pod_id LowCardinality(String), scrape_ts_microseconds DateTime64(6) CODEC(Delta(8), LZ4), event_date Date, event_time DateTime, payload Array(String), payload_01 String, payload_02 String, payload_03 String, payload_04 String, payload_05 String, payload_06 String, payload_07 String, payload_08 String, payload_09 String, payload_10 String, payload_11 String, payload_12 String, payload_13 String, payload_14 String, payload_15 String, payload_16 String, payload_17 String, payload_18 String, payload_19 String ) ENGINE=MergeTree() PARTITION BY toYYYYMM(event_date) ORDER BY (control_plane_id, event_date, pod_id) SETTINGS storage_policy='s3' """ ) node.query("SYSTEM STOP MERGES central_query_log") write_count = 2 write_query_ids = [] for x in range(write_count): query_id = f"INSERT_INTO_TABLE_RANDOM_DATA_QUERY_ID_{x}" write_query_ids.append(query_id) node.query( """ INSERT INTO central_query_log SELECT control_plane_id, pod_id, toStartOfHour(event_time) + toIntervalSecond(randUniform(0,60)) as scrape_ts_microseconds, toDate(event_time) as event_date, event_time, payload, payload[1] as payload_01, payload[2] as payload_02, payload[3] as payload_03, payload[4] as payload_04, payload[5] as payload_05, payload[6] as payload_06, payload[7] as payload_07, payload[8] as payload_08, payload[9] as payload_09, payload[10] as payload_10, payload[11] as payload_11, payload[12] as payload_12, payload[13] as payload_13, payload[14] as payload_14, payload[15] as payload_15, payload[16] as payload_16, payload[17] as payload_17, payload[18] as payload_18, payload[19] as payload_19 FROM ( SELECT control_plane_id, substring(payload[1], 1, 5) as pod_id, toDateTime('2022-12-12 00:00:00') + toIntervalDay(floor(randUniform(0,3))) + toIntervalHour(floor(randUniform(0,24))) + toIntervalSecond(floor(randUniform(0,60))) as event_time, payload FROM generateRandom( 'control_plane_id UUID, payload Array(String)', NULL, 100, 100 ) LIMIT 10000 ) SETTINGS max_insert_block_size=256000000, min_insert_block_size_rows=1000000, min_insert_block_size_bytes=256000000 """, query_id=query_id, ) memory = 845346116 for memory_usage, query_id in zip( get_memory_usages(node, write_query_ids), write_query_ids ): assert int(memory_usage) < 1.2 * memory, f"{memory_usage} : {query_id}" assert int(memory_usage) > 0.8 * memory, f"{memory_usage} : {query_id}" broken_s3.setup_slow_answers(minimal_length=1000, timeout=5, count=20) broken_s3.setup_fake_multpartuploads() insert_query_id = f"INSERT_INTO_S3_FUNCTION_QUERY_ID" node.query( """ INSERT INTO TABLE FUNCTION s3( 'http://resolver:8083/root/data/test-upload_{_partition_id}.csv.gz', 'minio', 'minio123', 'CSV', auto, 'gzip' ) PARTITION BY formatDateTime(subtractHours(toDateTime('2022-12-13 00:00:00'), 1),'%Y-%m-%d_%H:00') WITH toDateTime('2022-12-13 00:00:00') as time_point SELECT * FROM central_query_log WHERE event_date >= subtractDays(toDate(time_point), 1) AND scrape_ts_microseconds >= subtractHours(toStartOfHour(time_point), 12) AND scrape_ts_microseconds < toStartOfDay(time_point) SETTINGS s3_max_inflight_parts_for_one_file=1 """, query_id=insert_query_id, ) query_id = f"SELECT_QUERY_ID" total = node.query( """ SELECT count() FROM central_query_log """, query_id=query_id, ) assert int(total) == 10000 * write_count query_id = f"SELECT_WHERE_QUERY_ID" selected = node.query( """ WITH toDateTime('2022-12-13 00:00:00') as time_point SELECT count() FROM central_query_log WHERE event_date >= subtractDays(toDate(time_point), 1) AND scrape_ts_microseconds >= subtractHours(toStartOfHour(time_point), 12) AND scrape_ts_microseconds < toStartOfDay(time_point) """, query_id=query_id, ) assert int(selected) < 4500, selected assert int(selected) > 2500, selected node.query("SYSTEM FLUSH LOGS") profile_events = node.query( f""" SELECT ProfileEvents FROM system.query_log WHERE query_id='{insert_query_id}' AND type='QueryFinish' """ ) memory_usage = get_memory_usage(node, insert_query_id) memory = 123507857 assert int(memory_usage) < 1.2 * memory, f"{memory_usage} {profile_events}" > assert int(memory_usage) > 0.8 * memory, f"{memory_usage} {profile_events}" E AssertionError: 91018487 {'Query':1,'InsertQuery':1,'QueriesWithSubqueries':2,'SelectQueriesWithSubqueries':2,'FileOpen':162,'ReadBufferFromFileDescriptorRead':162,'ReadBufferFromFileDescriptorReadBytes':8192,'ReadCompressedBytes':69150727,'CompressedReadBufferBlocks':238,'CompressedReadBufferBytes':69049725,'OpenedFileCacheMisses':162,'OpenedFileCacheMicroseconds':1613,'IOBufferAllocs':494,'IOBufferAllocBytes':89132090,'ArenaAllocChunks':1,'ArenaAllocBytes':4096,'FunctionExecute':83,'TableFunctionExecute':1,'MarkCacheMisses':54,'CreatedReadBufferOrdinary':162,'DiskReadElapsedMicroseconds':966,'NetworkReceiveElapsedMicroseconds':844,'NetworkSendElapsedMicroseconds':11271,'NetworkSendBytes':51827,'InsertedRows':3469,'InsertedBytes':13851301,'SelectedParts':4,'SelectedRanges':4,'SelectedMarks':16,'SelectedRows':20000,'SelectedBytes':79924984,'WaitMarksLoadMicroseconds':203051,'LoadedMarksCount':270,'LoadedMarksMemoryBytes':6216,'ContextLock':501,'ContextLockWaitMicroseconds':267,'RWLockAcquiredReadLocks':4,'PartsLockHoldMicroseconds':74,'PartsLockWaitMicroseconds':5,'RealTimeMicroseconds':45224174,'UserTimeMicroseconds':4315171,'SystemTimeMicroseconds':1288972,'SoftPageFaults':356621,'OSCPUWaitMicroseconds':16903,'OSCPUVirtualTimeMicroseconds':5603954,'OSWriteBytes':221184,'OSReadChars':42752,'OSWriteChars':229810,'CreatedHTTPConnections':40,'S3ReadMicroseconds':153136,'S3ReadRequestsCount':108,'S3WriteMicroseconds':5150141,'S3WriteRequestsCount':1,'S3WriteRequestsRedirects':1,'DiskS3ReadMicroseconds':153136,'DiskS3ReadRequestsCount':108,'S3PutObject':1,'S3GetObject':108,'DiskS3GetObject':108,'ReadBufferFromS3Microseconds':1049914,'ReadBufferFromS3InitMicroseconds':337810,'ReadBufferFromS3Bytes':69157850,'ReadBufferFromS3PreservedSessions':54,'WriteBufferFromS3Microseconds':5206723,'WriteBufferFromS3Bytes':8346908,'WriteBufferFromS3WaitInflightLimitMicroseconds':5207078,'RemoteFSPrefetches':56,'RemoteFSPrefetchedReads':56,'RemoteFSPrefetchedBytes':24443021,'RemoteFSUnprefetchedReads':154,'RemoteFSUnprefetchedBytes':44714829,'RemoteFSBuffers':108,'ThreadpoolReaderTaskMicroseconds':804213,'ThreadpoolReaderReadBytes':24443021,'ThreadpoolReaderSubmit':3721,'AsynchronousRemoteReadWaitMicroseconds':42207,'SynchronousRemoteReadWaitMicroseconds':258962,'LogTest':785,'LogTrace':63,'LogDebug':13,'LogInfo':1} E E assert 91018487 > (0.8 * 123507857) E + where 91018487 = int(91018487) test_merge_tree_s3/test.py:1152: AssertionError ---------------------------- Captured stderr setup ----------------------------- Starting mock server broken_s3.py run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:False cmd: ['bash', '-c', 'echo aW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCByYW5kb20KaW1wb3J0IHRpbWUKaW1wb3J0IHVybGxpYi5wYXJzZQppbXBvcnQgaHR0cC5zZXJ2ZXIKaW1wb3J0IHNvY2tldHNlcnZlcgppbXBvcnQgc3RyaW5nCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN0cnVjdAoKCklORl9DT1VOVCA9IDEwMDAwMDAwMAoKCmRlZiBfYW5kX3RoZW4odmFsdWUsIGZ1bmMpOgogICAgYXNzZXJ0IGNhbGxhYmxlKGZ1bmMpCiAgICByZXR1cm4gTm9uZSBpZiB2YWx1ZSBpcyBOb25lIGVsc2UgZnVuYyh2YWx1ZSkKCgpjbGFzcyBNb2NrQ29udHJvbDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbHVzdGVyLCBjb250YWluZXIsIHBvcnQpOgogICAgICAgIHNlbGYuX2NsdXN0ZXIgPSBjbHVzdGVyCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gY29udGFpbmVyCiAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9yZXNldCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2FjdGlvbihzZWxmLCB3aGVuLCBjb3VudD1Ob25lLCBhZnRlcj1Ob25lLCBhY3Rpb249Tm9uZSwgYWN0aW9uX2FyZ3M9Tm9uZSk6CiAgICAgICAgdXJsID0gZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3t3aGVufT9ub3RoaW5nPTEiCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgaWYgYWZ0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhZnRlcj17YWZ0ZXJ9IgoKICAgICAgICBpZiBhY3Rpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb249e2FjdGlvbn0iCgogICAgICAgIGlmIGFjdGlvbl9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgeCBpbiBhY3Rpb25fYXJnczoKICAgICAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb25fYXJncz17eH0iCgogICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY2x1c3Rlci5leGVjX2luX2NvbnRhaW5lcigKICAgICAgICAgICAgc2VsZi5fY2x1c3Rlci5nZXRfY29udGFpbmVyX2lkKHNlbGYuX2NvbnRhaW5lciksCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICJjdXJsIiwKICAgICAgICAgICAgICAgICItcyIsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2F0X29iamVjdF91cGxvYWQoc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuc2V0dXBfYWN0aW9uKCJhdF9vYmplY3RfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2F0X3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfcGFydF91cGxvYWQiLCAqKmt3YXJncykKCiAgICBkZWYgc2V0dXBfYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2Zha2VfcHV0cyhzZWxmLCBwYXJ0X2xlbmd0aCk6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9mYWtlX3B1dHM/d2hlbl9sZW5ndGhfYmlnZ2VyPXtwYXJ0X2xlbmd0aH0iLAogICAgICAgICAgICBdLAogICAgICAgICAgICBub3Rocm93PVRydWUsCiAgICAgICAgKQogICAgICAgIGFzc2VydCByZXNwb25zZSA9PSAiT0siLCByZXNwb25zZQoKICAgIGRlZiBzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyhzZWxmKToKICAgICAgICByZXNwb25zZSA9IHNlbGYuX2NsdXN0ZXIuZXhlY19pbl9jb250YWluZXIoCiAgICAgICAgICAgIHNlbGYuX2NsdXN0ZXIuZ2V0X2NvbnRhaW5lcl9pZChzZWxmLl9jb250YWluZXIpLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY3VybCIsCiAgICAgICAgICAgICAgICAiLXMiLAogICAgICAgICAgICAgICAgZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3NldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzPyIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX3Nsb3dfYW5zd2VycygKICAgICAgICBzZWxmLCBtaW5pbWFsX2xlbmd0aD0wLCB0aW1lb3V0PU5vbmUsIHByb2JhYmlsaXR5PU5vbmUsIGNvdW50PU5vbmUKICAgICk6CiAgICAgICAgdXJsID0gKAogICAgICAgICAgICBmImh0dHA6Ly9sb2NhbGhvc3Q6e3NlbGYuX3BvcnR9LyIKICAgICAgICAgICAgZiJtb2NrX3NldHRpbmdzL3Nsb3dfcHV0IgogICAgICAgICAgICBmIj9taW5pbWFsX2xlbmd0aD17bWluaW1hbF9sZW5ndGh9IgogICAgICAgICkKCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnRpbWVvdXQ9e3RpbWVvdXR9IgoKICAgICAgICBpZiBwcm9iYWJpbGl0eSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnByb2JhYmlsaXR5PXtwcm9iYWJpbGl0eX0iCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWyJjdXJsIiwgIi1zIiwgdXJsXSwKICAgICAgICAgICAgbm90aHJvdz1UcnVlLAogICAgICAgICkKICAgICAgICBhc3NlcnQgcmVzcG9uc2UgPT0gIk9LIiwgcmVzcG9uc2UKCgpjbGFzcyBfU2VydmVyUnVudGltZToKICAgIGNsYXNzIFNsb3dQdXQ6CiAgICAgICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLAogICAgICAgICAgICBsb2NrLAogICAgICAgICAgICBwcm9iYWJpbGl0eV89Tm9uZSwKICAgICAgICAgICAgdGltZW91dF89Tm9uZSwKICAgICAgICAgICAgbWluaW1hbF9sZW5ndGhfPU5vbmUsCiAgICAgICAgICAgIGNvdW50Xz1Ob25lLAogICAgICAgICk6CiAgICAgICAgICAgIHNlbGYubG9jayA9IGxvY2sKICAgICAgICAgICAgc2VsZi5wcm9iYWJpbGl0eSA9IHByb2JhYmlsaXR5XyBpZiBwcm9iYWJpbGl0eV8gaXMgbm90IE5vbmUgZWxzZSAxCiAgICAgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXRfIGlmIHRpbWVvdXRfIGlzIG5vdCBOb25lIGVsc2UgMC4xCiAgICAgICAgICAgIHNlbGYubWluaW1hbF9sZW5ndGggPSBtaW5pbWFsX2xlbmd0aF8gaWYgbWluaW1hbF9sZW5ndGhfIGlzIG5vdCBOb25lIGVsc2UgMAogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAoKICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGYicHJvYmFiaWxpdHk6e3NlbGYucHJvYmFiaWxpdHl9IgogICAgICAgICAgICAgICAgZiIgdGltZW91dDp7c2VsZi50aW1lb3V0fSIKICAgICAgICAgICAgICAgIGYiIG1pbmltYWxfbGVuZ3RoOntzZWxmLm1pbmltYWxfbGVuZ3RofSIKICAgICAgICAgICAgICAgIGYiIGNvdW50OntzZWxmLmNvdW50fSIKICAgICAgICAgICAgKQoKICAgICAgICBkZWYgZ2V0X3RpbWVvdXQoc2VsZiwgY29udGVudF9sZW5ndGgpOgogICAgICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfbGVuZ3RoID4gc2VsZi5taW5pbWFsX2xlbmd0aDoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuc2xvd19wdXQucHJvYmFiaWxpdHkgPT0gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcmFuZG9tLnJhbmRvbSgpIDw9IF9ydW50aW1lLnNsb3dfcHV0LnByb2JhYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50IC09IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5zbG93X3B1dC50aW1lb3V0CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgY2xhc3MgRXhwZWN0ZWQ1MDBFcnJvckFjdGlvbjoKICAgICAgICBkZWYgaW5qZWN0X2Vycm9yKHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CiAgICAgICAgICAgIGRhdGEgPSAoCiAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nCiAgICAgICAgICAgICAgICAiPEVycm9yPiIKICAgICAgICAgICAgICAgICI8Q29kZT5FeHBlY3RlZEVycm9yPC9Db2RlPiIKICAgICAgICAgICAgICAgICI8TWVzc2FnZT5tb2NrIHMzIGluamVjdGVkIGVycm9yPC9NZXNzYWdlPiIKICAgICAgICAgICAgICAgICI8UmVxdWVzdElkPnR4ZmJkNTY2ZDAzMDQyNDc0ODg4MTkzLTAwNjA4ZDc1Mzc8L1JlcXVlc3RJZD4iCiAgICAgICAgICAgICAgICAiPC9FcnJvcj4iCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndyaXRlX2Vycm9yKGRhdGEpCgogICAgY2xhc3MgUmVkaXJlY3RBY3Rpb246CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9ImxvY2FsaG9zdCIsIHBvcnQ9MSk6CiAgICAgICAgICAgIHNlbGYuZHN0X2hvc3QgPSBfYW5kX3RoZW4oaG9zdCwgc3RyKQogICAgICAgICAgICBzZWxmLmRzdF9wb3J0ID0gX2FuZF90aGVuKHBvcnQsIGludCkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVkaXJlY3QoaG9zdD1zZWxmLmRzdF9ob3N0LCBwb3J0PXNlbGYuZHN0X3BvcnQpCgogICAgY2xhc3MgQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aXRoX3BhcnRpYWxfZGF0YT1Ob25lKToKICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAiIgogICAgICAgICAgICBpZiB3aXRoX3BhcnRpYWxfZGF0YSBpcyBub3QgTm9uZSBhbmQgd2l0aF9wYXJ0aWFsX2RhdGEgPT0gIjEiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICAgICAgICAgIjxJbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD5cbiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICAgICAgaWYgc2VsZi5wYXJ0aWFsX2RhdGE6CiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgMTAwMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuZW5kX2hlYWRlcnMoKQogICAgICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndmaWxlLndyaXRlKGJ5dGVzKHNlbGYucGFydGlhbF9kYXRhLCAiVVRGLTgiKSkKCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uc2V0c29ja29wdCgKICAgICAgICAgICAgICAgIHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fTElOR0VSLCBzdHJ1Y3QucGFjaygiaWkiLCAxLCAwKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5jb25uZWN0aW9uLmNsb3NlKCkKCiAgICBjbGFzcyBCcm9rZW5QaXBlQWN0aW9uOgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgIyBwYXJ0aWFsIHJlYWQKICAgICAgICAgICAgc2VsZi5yZmlsZS5yZWFkKDUwKQoKICAgICAgICAgICAgdGltZS5zbGVlcCgxKQogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuY29ubmVjdGlvbi5zZXRzb2Nrb3B0KAogICAgICAgICAgICAgICAgc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19MSU5HRVIsIHN0cnVjdC5wYWNrKCJpaSIsIDEsIDApCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uY2xvc2UoKQoKICAgIGNsYXNzIENvbm5lY3Rpb25SZWZ1c2VkQWN0aW9uKFJlZGlyZWN0QWN0aW9uKToKICAgICAgICBwYXNzCgogICAgY2xhc3MgQ291bnRBZnRlcjoKICAgICAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2ssIGNvdW50Xz1Ob25lLCBhZnRlcl89Tm9uZSwgYWN0aW9uXz1Ob25lLCBhY3Rpb25fYXJnc189W10KICAgICAgICApOgogICAgICAgICAgICBzZWxmLmxvY2sgPSBsb2NrCgogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAogICAgICAgICAgICBzZWxmLmFmdGVyID0gYWZ0ZXJfIGlmIGFmdGVyXyBpcyBub3QgTm9uZSBlbHNlIDAKICAgICAgICAgICAgc2VsZi5hY3Rpb24gPSBhY3Rpb25fCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX2FyZ3MgPSBhY3Rpb25fYXJnc18KCiAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3JlZnVzZWQiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlZnVzZWRBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3Jlc2V0X2J5X3BlZXIiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uKAogICAgICAgICAgICAgICAgICAgICpzZWxmLmFjdGlvbl9hcmdzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgc2VsZi5hY3Rpb24gPT0gImJyb2tlbl9waXBlIjoKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkJyb2tlblBpcGVBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJyZWRpcmVjdF90byI6CiAgICAgICAgICAgICAgICBzZWxmLmVycm9yX2hhbmRsZXIgPSBfU2VydmVyUnVudGltZS5SZWRpcmVjdEFjdGlvbigqc2VsZi5hY3Rpb25fYXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkV4cGVjdGVkNTAwRXJyb3JBY3Rpb24oKQoKICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgZGVmIGZyb21fY2dpX3BhcmFtcyhsb2NrLCBwYXJhbXMpOgogICAgICAgICAgICByZXR1cm4gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlcigKICAgICAgICAgICAgICAgIGxvY2s9bG9jaywKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICAgICAgYWZ0ZXJfPV9hbmRfdGhlbihwYXJhbXMuZ2V0KCJhZnRlciIsIFtOb25lXSlbMF0sIGludCksCiAgICAgICAgICAgICAgICBhY3Rpb25fPXBhcmFtcy5nZXQoImFjdGlvbiIsIFtOb25lXSlbMF0sCiAgICAgICAgICAgICAgICBhY3Rpb25fYXJnc189cGFyYW1zLmdldCgiYWN0aW9uX2FyZ3MiLCBbXSksCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBmImNvdW50OntzZWxmLmNvdW50fSBhZnRlcjp7c2VsZi5hZnRlcn0gYWN0aW9uOntzZWxmLmFjdGlvbn0gYWN0aW9uX2FyZ3M6e3NlbGYuYWN0aW9uX2FyZ3N9IgoKICAgICAgICBkZWYgaGFzX2VmZmVjdChzZWxmKToKICAgICAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmFmdGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXIgLT0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5hZnRlciA9PSAwOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY291bnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQgLT0gMQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyLmluamVjdF9lcnJvcihyZXF1ZXN0X2hhbmRsZXIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmF0X3BhcnRfdXBsb2FkID0gTm9uZQogICAgICAgIHNlbGYuYXRfb2JqZWN0X3VwbG9hZCA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfdXBsb2FkcyA9IGRpY3QoKQogICAgICAgIHNlbGYuc2xvd19wdXQgPSBOb25lCiAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgc2VsZi5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQgPSBOb25lCgogICAgZGVmIHJlZ2lzdGVyX2Zha2VfdXBsb2FkKHNlbGYsIHVwbG9hZF9pZCwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHNbdXBsb2FkX2lkXSA9IGtleQoKICAgIGRlZiBpc19mYWtlX3VwbG9hZChzZWxmLCB1cGxvYWRfaWQsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGlmIHVwbG9hZF9pZCBpbiBzZWxmLmZha2VfdXBsb2FkczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZha2VfdXBsb2Fkc1t1cGxvYWRfaWRdID09IGtleQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5hdF9wYXJ0X3VwbG9hZCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5hdF9vYmplY3RfdXBsb2FkID0gTm9uZQogICAgICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHMgPSBkaWN0KCkKICAgICAgICAgICAgc2VsZi5zbG93X3B1dCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gTm9uZQoKCl9ydW50aW1lID0gX1NlcnZlclJ1bnRpbWUoKQoKCmRlZiBnZXRfcmFuZG9tX3N0cmluZyhsZW5ndGgpOgogICAgIyBjaG9vc2UgZnJvbSBhbGwgbG93ZXJjYXNlIGxldHRlcgogICAgbGV0dGVycyA9IHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKICAgIHJlc3VsdF9zdHIgPSAiIi5qb2luKHJhbmRvbS5jaG9pY2UobGV0dGVycykgZm9yIGkgaW4gcmFuZ2UobGVuZ3RoKSkKICAgIHJldHVybiByZXN1bHRfc3RyCgoKY2xhc3MgUmVxdWVzdEhhbmRsZXIoaHR0cC5zZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CiAgICBkZWYgX29rKHNlbGYpOgogICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYiJPSyIpCgogICAgZGVmIF9waW5nKHNlbGYpOgogICAgICAgIHNlbGYuX29rKCkKCiAgICBkZWYgcmVhZF9hbGxfaW5wdXQoc2VsZik6CiAgICAgICAgY29udGVudF9sZW5ndGggPSBpbnQoc2VsZi5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiLCAwKSkKICAgICAgICB0b19yZWFkID0gY29udGVudF9sZW5ndGgKICAgICAgICB3aGlsZSB0b19yZWFkID4gMDoKICAgICAgICAgICAgIyByZWFkIGNvbnRlbnQgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb3Igb24gY2xpZW50CiAgICAgICAgICAgICMgUG9jbzo6RXhjZXB0aW9uLiBDb2RlOiAxMDAwLCBlLmNvZGUoKSA9IDMyLCBJL08gZXJyb3I6IEJyb2tlbiBwaXBlCiAgICAgICAgICAgICMgZG8gaXQgcGllY2UgYnkgcGllY2UgaW4gb3JkZXIgdG8gYXZvaWQgYmlnIGFsbG9jYXRpb24KICAgICAgICAgICAgc2l6ZSA9IG1pbih0b19yZWFkLCAxMDI0KQogICAgICAgICAgICBzdHIoc2VsZi5yZmlsZS5yZWFkKHNpemUpKQogICAgICAgICAgICB0b19yZWFkIC09IHNpemUKCiAgICBkZWYgcmVkaXJlY3Qoc2VsZiwgaG9zdD1Ob25lLCBwb3J0PU5vbmUpOgogICAgICAgIGlmIGhvc3QgaXMgTm9uZSBhbmQgcG9ydCBpcyBOb25lOgogICAgICAgICAgICBob3N0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1faG9zdAogICAgICAgICAgICBwb3J0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1fcG9ydAoKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKCiAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDMwNykKICAgICAgICB1cmwgPSBmImh0dHA6Ly97aG9zdH06e3BvcnR9e3NlbGYucGF0aH0iCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgicmVkaXJlY3QgdG8gJXMiLCB1cmwpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiTG9jYXRpb24iLCB1cmwpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgc2VsZi53ZmlsZS53cml0ZShiIlJlZGlyZWN0ZWQiKQoKICAgIGRlZiB3cml0ZV9lcnJvcihzZWxmLCBkYXRhLCBjb250ZW50X2xlbmd0aD1Ob25lKToKICAgICAgICBpZiBjb250ZW50X2xlbmd0aCBpcyBOb25lOgogICAgICAgICAgICBjb250ZW50X2xlbmd0aCA9IGxlbihkYXRhKQogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIndyaXRlX2Vycm9yICVzIiwgZGF0YSkKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIoY29udGVudF9sZW5ndGgpKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3B1dF9vayhzZWxmKToKICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJmYWtlIHB1dCIpCgogICAgICAgIHNlbGYucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiRVRhZyIsICJiNTQzNTdmYWYwNjMyY2NlNDZlOTQyZmE2ODM1NmIzOCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCAwKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQoKICAgIGRlZiBfZmFrZV91cGxvYWRzKHNlbGYsIHBhdGgsIHVwbG9hZF9pZCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8SW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPEJ1Y2tldD57YnVja2V0fTwvQnVja2V0PiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+IgogICAgICAgICAgICBmIjxVcGxvYWRJZD57dXBsb2FkX2lkfTwvVXBsb2FkSWQ+IgogICAgICAgICAgICAiPC9Jbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3Bvc3Rfb2soc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgbG9jYXRpb24gPSAiaHR0cDovL0V4YW1wbGUtQnVja2V0LnMzLlJlZ2lvbi5hbWF6b25hd3MuY29tLyIgKyBwYXRoCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPExvY2F0aW9uPntsb2NhdGlvbn08L0xvY2F0aW9uPlxuIgogICAgICAgICAgICBmIjxCdWNrZXQ+e2J1Y2tldH08L0J1Y2tldD5cbiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+XG4iCiAgICAgICAgICAgIGYnPEVUYWc+IjM4NThmNjIyMzBhYzNjOTE1ZjMwMGM2NjQzMTJjMTFmLTkiPC9FVGFnPlxuJwogICAgICAgICAgICBmIjwvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9tb2NrX3NldHRpbmdzKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXRoID0gW3ggZm9yIHggaW4gcGFydHMucGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYXNzZXJ0IHBhdGhbMF0gPT0gIm1vY2tfc2V0dGluZ3MiLCBwYXRoCiAgICAgICAgaWYgbGVuKHBhdGgpIDwgMjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfcGFydF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCA9IF9TZXJ2ZXJSdW50aW1lLkNvdW50QWZ0ZXIuZnJvbV9jZ2lfcGFyYW1zKAogICAgICAgICAgICAgICAgX3J1bnRpbWUubG9jaywgcGFyYW1zCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGF0X3BhcnRfdXBsb2FkICVzIiwgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImF0X29iamVjdF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkID0gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoCiAgICAgICAgICAgICAgICBfcnVudGltZS5sb2NrLCBwYXJhbXMKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJzZXQgYXRfb2JqZWN0X3VwbG9hZCAlcyIsIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImZha2VfcHV0cyI6CiAgICAgICAgICAgIHBhcmFtcyA9IHVybGxpYi5wYXJzZS5wYXJzZV9xcyhwYXJ0cy5xdWVyeSwga2VlcF9ibGFua192YWx1ZXM9RmFsc2UpCiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IGludCgKICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoIndoZW5fbGVuZ3RoX2JpZ2dlciIsIFsxMDI0ICogMTAyNF0pWzBdCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGZha2VfcHV0cyAlcyIsIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAic2xvd19wdXQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5zbG93X3B1dCA9IF9TZXJ2ZXJSdW50aW1lLlNsb3dQdXQoCiAgICAgICAgICAgICAgICBsb2NrPV9ydW50aW1lLmxvY2ssCiAgICAgICAgICAgICAgICBtaW5pbWFsX2xlbmd0aF89X2FuZF90aGVuKHBhcmFtcy5nZXQoIm1pbmltYWxfbGVuZ3RoIiwgW05vbmVdKVswXSwgaW50KSwKICAgICAgICAgICAgICAgIHByb2JhYmlsaXR5Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgicHJvYmFiaWxpdHkiLCBbTm9uZV0pWzBdLCBmbG9hdCksCiAgICAgICAgICAgICAgICB0aW1lb3V0Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgidGltZW91dCIsIFtOb25lXSlbMF0sIGZsb2F0KSwKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInNldCBzbG93IHB1dCAlcyIsIF9ydW50aW1lLnNsb3dfcHV0KQogICAgICAgICAgICByZXR1cm4gc2VsZi5fb2soKQoKICAgICAgICBpZiBwYXRoWzFdID09ICJzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyI6CiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfbXVsdGlwYXJ0X3VwbG9hZCA9IFRydWUKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IHNldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzIikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIjoKICAgICAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICAgICAgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gKAogICAgICAgICAgICAgICAgX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoX3J1bnRpbWUubG9jaywgcGFyYW1zKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAic2V0IGF0X2NyZWF0ZV9tdWx0aV9wYXJ0X3VwbG9hZCAlcyIsCiAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAicmVzZXQiOgogICAgICAgICAgICBfcnVudGltZS5yZXNldCgpCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInJlc2V0IikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICBkZWYgZG9fR0VUKHNlbGYpOgogICAgICAgIGlmIHNlbGYucGF0aCA9PSAiLyI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9waW5nKCkKCiAgICAgICAgaWYgc2VsZi5wYXRoLnN0YXJ0c3dpdGgoIi9tb2NrX3NldHRpbmdzIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2NrX3NldHRpbmdzKCkKCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiZ2V0IHJlZGlyZWN0IikKICAgICAgICByZXR1cm4gc2VsZi5yZWRpcmVjdCgpCgogICAgZGVmIGRvX1BVVChzZWxmKToKICAgICAgICBjb250ZW50X2xlbmd0aCA9IGludChzZWxmLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIsIDApKQoKICAgICAgICBpZiBfcnVudGltZS5zbG93X3B1dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGltZW91dCA9IF9ydW50aW1lLnNsb3dfcHV0LmdldF90aW1lb3V0KGNvbnRlbnRfbGVuZ3RoKQogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2xvdyBwdXQgJXMiLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0KQoKICAgICAgICBwYXJ0cyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdChzZWxmLnBhdGgpCiAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KCiAgICAgICAgaWYgdXBsb2FkX2lkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgInB1dCBhdF9wYXJ0X3VwbG9hZCAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICB1cGxvYWRfaWQsCiAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQuaGFzX2VmZmVjdCgpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZC5pbmplY3RfZXJyb3Ioc2VsZikKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuaXNfZmFrZV91cGxvYWQodXBsb2FkX2lkLCBwYXJ0cy5wYXRoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wdXRfb2soKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGVycm9yX2F0X29iamVjdF91cGxvYWQgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuYXRfb2JqZWN0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQogICAgICAgICAgICBpZiBfcnVudGltZS5mYWtlX3B1dF93aGVuX2xlbmd0aF9iaWdnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBjb250ZW50X2xlbmd0aCA+IF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuZmFrZV9wdXRfd2hlbl9sZW5ndGhfYmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3B1dF9vaygpCgogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICJwdXQgcmVkaXJlY3QgJXMiLAogICAgICAgICAgICBwYXJ0cywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYucmVkaXJlY3QoKQoKICAgIGRlZiBkb19QT1NUKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPVRydWUpCiAgICAgICAgdXBsb2FkcyA9IHBhcmFtcy5nZXQoInVwbG9hZHMiLCBbTm9uZV0pWzBdCiAgICAgICAgaWYgdXBsb2FkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQoKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgdXBsb2FkX2lkID0gZ2V0X3JhbmRvbV9zdHJpbmcoNSkKICAgICAgICAgICAgICAgIF9ydW50aW1lLnJlZ2lzdGVyX2Zha2VfdXBsb2FkKHVwbG9hZF9pZCwgcGFydHMucGF0aCkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3VwbG9hZHMocGFydHMucGF0aCwgdXBsb2FkX2lkKQoKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KICAgICAgICBpZiBfcnVudGltZS5pc19mYWtlX3VwbG9hZCh1cGxvYWRfaWQsIHBhcnRzLnBhdGgpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wb3N0X29rKHBhcnRzLnBhdGgpCgogICAgICAgIHJldHVybiBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fSEVBRChzZWxmKToKICAgICAgICBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fREVMRVRFKHNlbGYpOgogICAgICAgIHNlbGYucmVkaXJlY3QoKQoKCmNsYXNzIF9UaHJlYWRlZEhUVFBTZXJ2ZXIoc29ja2V0c2VydmVyLlRocmVhZGluZ01peEluLCBodHRwLnNlcnZlci5IVFRQU2VydmVyKToKICAgICIiIkhhbmRsZSByZXF1ZXN0cyBpbiBhIHNlcGFyYXRlIHRocmVhZC4iIiIKCiAgICBkZWYgc2V0X3Vwc3RyZWFtKHNlbGYsIHVwc3RyZWFtX2hvc3QsIHVwc3RyZWFtX3BvcnQpOgogICAgICAgIHNlbGYudXBzdHJlYW1faG9zdCA9IHVwc3RyZWFtX2hvc3QKICAgICAgICBzZWxmLnVwc3RyZWFtX3BvcnQgPSB1cHN0cmVhbV9wb3J0CgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGh0dHBkID0gX1RocmVhZGVkSFRUUFNlcnZlcigoIjAuMC4wLjAiLCBpbnQoc3lzLmFyZ3ZbMV0pKSwgUmVxdWVzdEhhbmRsZXIpCiAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDQ6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKHN5cy5hcmd2WzJdLCBzeXMuYXJndlszXSkKICAgIGVsc2U6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKCJtaW5pbzEiLCA5MDAxKQogICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCg== | base64 --decode > broken_s3.py'] Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'bash', '-c', 'echo aW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCByYW5kb20KaW1wb3J0IHRpbWUKaW1wb3J0IHVybGxpYi5wYXJzZQppbXBvcnQgaHR0cC5zZXJ2ZXIKaW1wb3J0IHNvY2tldHNlcnZlcgppbXBvcnQgc3RyaW5nCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN0cnVjdAoKCklORl9DT1VOVCA9IDEwMDAwMDAwMAoKCmRlZiBfYW5kX3RoZW4odmFsdWUsIGZ1bmMpOgogICAgYXNzZXJ0IGNhbGxhYmxlKGZ1bmMpCiAgICByZXR1cm4gTm9uZSBpZiB2YWx1ZSBpcyBOb25lIGVsc2UgZnVuYyh2YWx1ZSkKCgpjbGFzcyBNb2NrQ29udHJvbDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbHVzdGVyLCBjb250YWluZXIsIHBvcnQpOgogICAgICAgIHNlbGYuX2NsdXN0ZXIgPSBjbHVzdGVyCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gY29udGFpbmVyCiAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9yZXNldCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2FjdGlvbihzZWxmLCB3aGVuLCBjb3VudD1Ob25lLCBhZnRlcj1Ob25lLCBhY3Rpb249Tm9uZSwgYWN0aW9uX2FyZ3M9Tm9uZSk6CiAgICAgICAgdXJsID0gZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3t3aGVufT9ub3RoaW5nPTEiCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgaWYgYWZ0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhZnRlcj17YWZ0ZXJ9IgoKICAgICAgICBpZiBhY3Rpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb249e2FjdGlvbn0iCgogICAgICAgIGlmIGFjdGlvbl9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgeCBpbiBhY3Rpb25fYXJnczoKICAgICAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb25fYXJncz17eH0iCgogICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY2x1c3Rlci5leGVjX2luX2NvbnRhaW5lcigKICAgICAgICAgICAgc2VsZi5fY2x1c3Rlci5nZXRfY29udGFpbmVyX2lkKHNlbGYuX2NvbnRhaW5lciksCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICJjdXJsIiwKICAgICAgICAgICAgICAgICItcyIsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2F0X29iamVjdF91cGxvYWQoc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuc2V0dXBfYWN0aW9uKCJhdF9vYmplY3RfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2F0X3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfcGFydF91cGxvYWQiLCAqKmt3YXJncykKCiAgICBkZWYgc2V0dXBfYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2Zha2VfcHV0cyhzZWxmLCBwYXJ0X2xlbmd0aCk6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9mYWtlX3B1dHM/d2hlbl9sZW5ndGhfYmlnZ2VyPXtwYXJ0X2xlbmd0aH0iLAogICAgICAgICAgICBdLAogICAgICAgICAgICBub3Rocm93PVRydWUsCiAgICAgICAgKQogICAgICAgIGFzc2VydCByZXNwb25zZSA9PSAiT0siLCByZXNwb25zZQoKICAgIGRlZiBzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyhzZWxmKToKICAgICAgICByZXNwb25zZSA9IHNlbGYuX2NsdXN0ZXIuZXhlY19pbl9jb250YWluZXIoCiAgICAgICAgICAgIHNlbGYuX2NsdXN0ZXIuZ2V0X2NvbnRhaW5lcl9pZChzZWxmLl9jb250YWluZXIpLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY3VybCIsCiAgICAgICAgICAgICAgICAiLXMiLAogICAgICAgICAgICAgICAgZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3NldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzPyIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX3Nsb3dfYW5zd2VycygKICAgICAgICBzZWxmLCBtaW5pbWFsX2xlbmd0aD0wLCB0aW1lb3V0PU5vbmUsIHByb2JhYmlsaXR5PU5vbmUsIGNvdW50PU5vbmUKICAgICk6CiAgICAgICAgdXJsID0gKAogICAgICAgICAgICBmImh0dHA6Ly9sb2NhbGhvc3Q6e3NlbGYuX3BvcnR9LyIKICAgICAgICAgICAgZiJtb2NrX3NldHRpbmdzL3Nsb3dfcHV0IgogICAgICAgICAgICBmIj9taW5pbWFsX2xlbmd0aD17bWluaW1hbF9sZW5ndGh9IgogICAgICAgICkKCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnRpbWVvdXQ9e3RpbWVvdXR9IgoKICAgICAgICBpZiBwcm9iYWJpbGl0eSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnByb2JhYmlsaXR5PXtwcm9iYWJpbGl0eX0iCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWyJjdXJsIiwgIi1zIiwgdXJsXSwKICAgICAgICAgICAgbm90aHJvdz1UcnVlLAogICAgICAgICkKICAgICAgICBhc3NlcnQgcmVzcG9uc2UgPT0gIk9LIiwgcmVzcG9uc2UKCgpjbGFzcyBfU2VydmVyUnVudGltZToKICAgIGNsYXNzIFNsb3dQdXQ6CiAgICAgICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLAogICAgICAgICAgICBsb2NrLAogICAgICAgICAgICBwcm9iYWJpbGl0eV89Tm9uZSwKICAgICAgICAgICAgdGltZW91dF89Tm9uZSwKICAgICAgICAgICAgbWluaW1hbF9sZW5ndGhfPU5vbmUsCiAgICAgICAgICAgIGNvdW50Xz1Ob25lLAogICAgICAgICk6CiAgICAgICAgICAgIHNlbGYubG9jayA9IGxvY2sKICAgICAgICAgICAgc2VsZi5wcm9iYWJpbGl0eSA9IHByb2JhYmlsaXR5XyBpZiBwcm9iYWJpbGl0eV8gaXMgbm90IE5vbmUgZWxzZSAxCiAgICAgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXRfIGlmIHRpbWVvdXRfIGlzIG5vdCBOb25lIGVsc2UgMC4xCiAgICAgICAgICAgIHNlbGYubWluaW1hbF9sZW5ndGggPSBtaW5pbWFsX2xlbmd0aF8gaWYgbWluaW1hbF9sZW5ndGhfIGlzIG5vdCBOb25lIGVsc2UgMAogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAoKICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGYicHJvYmFiaWxpdHk6e3NlbGYucHJvYmFiaWxpdHl9IgogICAgICAgICAgICAgICAgZiIgdGltZW91dDp7c2VsZi50aW1lb3V0fSIKICAgICAgICAgICAgICAgIGYiIG1pbmltYWxfbGVuZ3RoOntzZWxmLm1pbmltYWxfbGVuZ3RofSIKICAgICAgICAgICAgICAgIGYiIGNvdW50OntzZWxmLmNvdW50fSIKICAgICAgICAgICAgKQoKICAgICAgICBkZWYgZ2V0X3RpbWVvdXQoc2VsZiwgY29udGVudF9sZW5ndGgpOgogICAgICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfbGVuZ3RoID4gc2VsZi5taW5pbWFsX2xlbmd0aDoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuc2xvd19wdXQucHJvYmFiaWxpdHkgPT0gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcmFuZG9tLnJhbmRvbSgpIDw9IF9ydW50aW1lLnNsb3dfcHV0LnByb2JhYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50IC09IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5zbG93X3B1dC50aW1lb3V0CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgY2xhc3MgRXhwZWN0ZWQ1MDBFcnJvckFjdGlvbjoKICAgICAgICBkZWYgaW5qZWN0X2Vycm9yKHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CiAgICAgICAgICAgIGRhdGEgPSAoCiAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nCiAgICAgICAgICAgICAgICAiPEVycm9yPiIKICAgICAgICAgICAgICAgICI8Q29kZT5FeHBlY3RlZEVycm9yPC9Db2RlPiIKICAgICAgICAgICAgICAgICI8TWVzc2FnZT5tb2NrIHMzIGluamVjdGVkIGVycm9yPC9NZXNzYWdlPiIKICAgICAgICAgICAgICAgICI8UmVxdWVzdElkPnR4ZmJkNTY2ZDAzMDQyNDc0ODg4MTkzLTAwNjA4ZDc1Mzc8L1JlcXVlc3RJZD4iCiAgICAgICAgICAgICAgICAiPC9FcnJvcj4iCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndyaXRlX2Vycm9yKGRhdGEpCgogICAgY2xhc3MgUmVkaXJlY3RBY3Rpb246CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9ImxvY2FsaG9zdCIsIHBvcnQ9MSk6CiAgICAgICAgICAgIHNlbGYuZHN0X2hvc3QgPSBfYW5kX3RoZW4oaG9zdCwgc3RyKQogICAgICAgICAgICBzZWxmLmRzdF9wb3J0ID0gX2FuZF90aGVuKHBvcnQsIGludCkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVkaXJlY3QoaG9zdD1zZWxmLmRzdF9ob3N0LCBwb3J0PXNlbGYuZHN0X3BvcnQpCgogICAgY2xhc3MgQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aXRoX3BhcnRpYWxfZGF0YT1Ob25lKToKICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAiIgogICAgICAgICAgICBpZiB3aXRoX3BhcnRpYWxfZGF0YSBpcyBub3QgTm9uZSBhbmQgd2l0aF9wYXJ0aWFsX2RhdGEgPT0gIjEiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICAgICAgICAgIjxJbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD5cbiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICAgICAgaWYgc2VsZi5wYXJ0aWFsX2RhdGE6CiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgMTAwMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuZW5kX2hlYWRlcnMoKQogICAgICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndmaWxlLndyaXRlKGJ5dGVzKHNlbGYucGFydGlhbF9kYXRhLCAiVVRGLTgiKSkKCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uc2V0c29ja29wdCgKICAgICAgICAgICAgICAgIHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fTElOR0VSLCBzdHJ1Y3QucGFjaygiaWkiLCAxLCAwKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5jb25uZWN0aW9uLmNsb3NlKCkKCiAgICBjbGFzcyBCcm9rZW5QaXBlQWN0aW9uOgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgIyBwYXJ0aWFsIHJlYWQKICAgICAgICAgICAgc2VsZi5yZmlsZS5yZWFkKDUwKQoKICAgICAgICAgICAgdGltZS5zbGVlcCgxKQogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuY29ubmVjdGlvbi5zZXRzb2Nrb3B0KAogICAgICAgICAgICAgICAgc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19MSU5HRVIsIHN0cnVjdC5wYWNrKCJpaSIsIDEsIDApCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uY2xvc2UoKQoKICAgIGNsYXNzIENvbm5lY3Rpb25SZWZ1c2VkQWN0aW9uKFJlZGlyZWN0QWN0aW9uKToKICAgICAgICBwYXNzCgogICAgY2xhc3MgQ291bnRBZnRlcjoKICAgICAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2ssIGNvdW50Xz1Ob25lLCBhZnRlcl89Tm9uZSwgYWN0aW9uXz1Ob25lLCBhY3Rpb25fYXJnc189W10KICAgICAgICApOgogICAgICAgICAgICBzZWxmLmxvY2sgPSBsb2NrCgogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAogICAgICAgICAgICBzZWxmLmFmdGVyID0gYWZ0ZXJfIGlmIGFmdGVyXyBpcyBub3QgTm9uZSBlbHNlIDAKICAgICAgICAgICAgc2VsZi5hY3Rpb24gPSBhY3Rpb25fCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX2FyZ3MgPSBhY3Rpb25fYXJnc18KCiAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3JlZnVzZWQiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlZnVzZWRBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3Jlc2V0X2J5X3BlZXIiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uKAogICAgICAgICAgICAgICAgICAgICpzZWxmLmFjdGlvbl9hcmdzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgc2VsZi5hY3Rpb24gPT0gImJyb2tlbl9waXBlIjoKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkJyb2tlblBpcGVBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJyZWRpcmVjdF90byI6CiAgICAgICAgICAgICAgICBzZWxmLmVycm9yX2hhbmRsZXIgPSBfU2VydmVyUnVudGltZS5SZWRpcmVjdEFjdGlvbigqc2VsZi5hY3Rpb25fYXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkV4cGVjdGVkNTAwRXJyb3JBY3Rpb24oKQoKICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgZGVmIGZyb21fY2dpX3BhcmFtcyhsb2NrLCBwYXJhbXMpOgogICAgICAgICAgICByZXR1cm4gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlcigKICAgICAgICAgICAgICAgIGxvY2s9bG9jaywKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICAgICAgYWZ0ZXJfPV9hbmRfdGhlbihwYXJhbXMuZ2V0KCJhZnRlciIsIFtOb25lXSlbMF0sIGludCksCiAgICAgICAgICAgICAgICBhY3Rpb25fPXBhcmFtcy5nZXQoImFjdGlvbiIsIFtOb25lXSlbMF0sCiAgICAgICAgICAgICAgICBhY3Rpb25fYXJnc189cGFyYW1zLmdldCgiYWN0aW9uX2FyZ3MiLCBbXSksCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBmImNvdW50OntzZWxmLmNvdW50fSBhZnRlcjp7c2VsZi5hZnRlcn0gYWN0aW9uOntzZWxmLmFjdGlvbn0gYWN0aW9uX2FyZ3M6e3NlbGYuYWN0aW9uX2FyZ3N9IgoKICAgICAgICBkZWYgaGFzX2VmZmVjdChzZWxmKToKICAgICAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmFmdGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXIgLT0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5hZnRlciA9PSAwOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY291bnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQgLT0gMQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyLmluamVjdF9lcnJvcihyZXF1ZXN0X2hhbmRsZXIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmF0X3BhcnRfdXBsb2FkID0gTm9uZQogICAgICAgIHNlbGYuYXRfb2JqZWN0X3VwbG9hZCA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfdXBsb2FkcyA9IGRpY3QoKQogICAgICAgIHNlbGYuc2xvd19wdXQgPSBOb25lCiAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgc2VsZi5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQgPSBOb25lCgogICAgZGVmIHJlZ2lzdGVyX2Zha2VfdXBsb2FkKHNlbGYsIHVwbG9hZF9pZCwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHNbdXBsb2FkX2lkXSA9IGtleQoKICAgIGRlZiBpc19mYWtlX3VwbG9hZChzZWxmLCB1cGxvYWRfaWQsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGlmIHVwbG9hZF9pZCBpbiBzZWxmLmZha2VfdXBsb2FkczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZha2VfdXBsb2Fkc1t1cGxvYWRfaWRdID09IGtleQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5hdF9wYXJ0X3VwbG9hZCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5hdF9vYmplY3RfdXBsb2FkID0gTm9uZQogICAgICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHMgPSBkaWN0KCkKICAgICAgICAgICAgc2VsZi5zbG93X3B1dCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gTm9uZQoKCl9ydW50aW1lID0gX1NlcnZlclJ1bnRpbWUoKQoKCmRlZiBnZXRfcmFuZG9tX3N0cmluZyhsZW5ndGgpOgogICAgIyBjaG9vc2UgZnJvbSBhbGwgbG93ZXJjYXNlIGxldHRlcgogICAgbGV0dGVycyA9IHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKICAgIHJlc3VsdF9zdHIgPSAiIi5qb2luKHJhbmRvbS5jaG9pY2UobGV0dGVycykgZm9yIGkgaW4gcmFuZ2UobGVuZ3RoKSkKICAgIHJldHVybiByZXN1bHRfc3RyCgoKY2xhc3MgUmVxdWVzdEhhbmRsZXIoaHR0cC5zZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CiAgICBkZWYgX29rKHNlbGYpOgogICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYiJPSyIpCgogICAgZGVmIF9waW5nKHNlbGYpOgogICAgICAgIHNlbGYuX29rKCkKCiAgICBkZWYgcmVhZF9hbGxfaW5wdXQoc2VsZik6CiAgICAgICAgY29udGVudF9sZW5ndGggPSBpbnQoc2VsZi5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiLCAwKSkKICAgICAgICB0b19yZWFkID0gY29udGVudF9sZW5ndGgKICAgICAgICB3aGlsZSB0b19yZWFkID4gMDoKICAgICAgICAgICAgIyByZWFkIGNvbnRlbnQgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb3Igb24gY2xpZW50CiAgICAgICAgICAgICMgUG9jbzo6RXhjZXB0aW9uLiBDb2RlOiAxMDAwLCBlLmNvZGUoKSA9IDMyLCBJL08gZXJyb3I6IEJyb2tlbiBwaXBlCiAgICAgICAgICAgICMgZG8gaXQgcGllY2UgYnkgcGllY2UgaW4gb3JkZXIgdG8gYXZvaWQgYmlnIGFsbG9jYXRpb24KICAgICAgICAgICAgc2l6ZSA9IG1pbih0b19yZWFkLCAxMDI0KQogICAgICAgICAgICBzdHIoc2VsZi5yZmlsZS5yZWFkKHNpemUpKQogICAgICAgICAgICB0b19yZWFkIC09IHNpemUKCiAgICBkZWYgcmVkaXJlY3Qoc2VsZiwgaG9zdD1Ob25lLCBwb3J0PU5vbmUpOgogICAgICAgIGlmIGhvc3QgaXMgTm9uZSBhbmQgcG9ydCBpcyBOb25lOgogICAgICAgICAgICBob3N0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1faG9zdAogICAgICAgICAgICBwb3J0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1fcG9ydAoKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKCiAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDMwNykKICAgICAgICB1cmwgPSBmImh0dHA6Ly97aG9zdH06e3BvcnR9e3NlbGYucGF0aH0iCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgicmVkaXJlY3QgdG8gJXMiLCB1cmwpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiTG9jYXRpb24iLCB1cmwpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgc2VsZi53ZmlsZS53cml0ZShiIlJlZGlyZWN0ZWQiKQoKICAgIGRlZiB3cml0ZV9lcnJvcihzZWxmLCBkYXRhLCBjb250ZW50X2xlbmd0aD1Ob25lKToKICAgICAgICBpZiBjb250ZW50X2xlbmd0aCBpcyBOb25lOgogICAgICAgICAgICBjb250ZW50X2xlbmd0aCA9IGxlbihkYXRhKQogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIndyaXRlX2Vycm9yICVzIiwgZGF0YSkKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIoY29udGVudF9sZW5ndGgpKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3B1dF9vayhzZWxmKToKICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJmYWtlIHB1dCIpCgogICAgICAgIHNlbGYucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiRVRhZyIsICJiNTQzNTdmYWYwNjMyY2NlNDZlOTQyZmE2ODM1NmIzOCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCAwKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQoKICAgIGRlZiBfZmFrZV91cGxvYWRzKHNlbGYsIHBhdGgsIHVwbG9hZF9pZCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8SW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPEJ1Y2tldD57YnVja2V0fTwvQnVja2V0PiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+IgogICAgICAgICAgICBmIjxVcGxvYWRJZD57dXBsb2FkX2lkfTwvVXBsb2FkSWQ+IgogICAgICAgICAgICAiPC9Jbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3Bvc3Rfb2soc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgbG9jYXRpb24gPSAiaHR0cDovL0V4YW1wbGUtQnVja2V0LnMzLlJlZ2lvbi5hbWF6b25hd3MuY29tLyIgKyBwYXRoCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPExvY2F0aW9uPntsb2NhdGlvbn08L0xvY2F0aW9uPlxuIgogICAgICAgICAgICBmIjxCdWNrZXQ+e2J1Y2tldH08L0J1Y2tldD5cbiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+XG4iCiAgICAgICAgICAgIGYnPEVUYWc+IjM4NThmNjIyMzBhYzNjOTE1ZjMwMGM2NjQzMTJjMTFmLTkiPC9FVGFnPlxuJwogICAgICAgICAgICBmIjwvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9tb2NrX3NldHRpbmdzKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXRoID0gW3ggZm9yIHggaW4gcGFydHMucGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYXNzZXJ0IHBhdGhbMF0gPT0gIm1vY2tfc2V0dGluZ3MiLCBwYXRoCiAgICAgICAgaWYgbGVuKHBhdGgpIDwgMjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfcGFydF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCA9IF9TZXJ2ZXJSdW50aW1lLkNvdW50QWZ0ZXIuZnJvbV9jZ2lfcGFyYW1zKAogICAgICAgICAgICAgICAgX3J1bnRpbWUubG9jaywgcGFyYW1zCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGF0X3BhcnRfdXBsb2FkICVzIiwgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImF0X29iamVjdF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkID0gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoCiAgICAgICAgICAgICAgICBfcnVudGltZS5sb2NrLCBwYXJhbXMKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJzZXQgYXRfb2JqZWN0X3VwbG9hZCAlcyIsIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImZha2VfcHV0cyI6CiAgICAgICAgICAgIHBhcmFtcyA9IHVybGxpYi5wYXJzZS5wYXJzZV9xcyhwYXJ0cy5xdWVyeSwga2VlcF9ibGFua192YWx1ZXM9RmFsc2UpCiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IGludCgKICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoIndoZW5fbGVuZ3RoX2JpZ2dlciIsIFsxMDI0ICogMTAyNF0pWzBdCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGZha2VfcHV0cyAlcyIsIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAic2xvd19wdXQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5zbG93X3B1dCA9IF9TZXJ2ZXJSdW50aW1lLlNsb3dQdXQoCiAgICAgICAgICAgICAgICBsb2NrPV9ydW50aW1lLmxvY2ssCiAgICAgICAgICAgICAgICBtaW5pbWFsX2xlbmd0aF89X2FuZF90aGVuKHBhcmFtcy5nZXQoIm1pbmltYWxfbGVuZ3RoIiwgW05vbmVdKVswXSwgaW50KSwKICAgICAgICAgICAgICAgIHByb2JhYmlsaXR5Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgicHJvYmFiaWxpdHkiLCBbTm9uZV0pWzBdLCBmbG9hdCksCiAgICAgICAgICAgICAgICB0aW1lb3V0Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgidGltZW91dCIsIFtOb25lXSlbMF0sIGZsb2F0KSwKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInNldCBzbG93IHB1dCAlcyIsIF9ydW50aW1lLnNsb3dfcHV0KQogICAgICAgICAgICByZXR1cm4gc2VsZi5fb2soKQoKICAgICAgICBpZiBwYXRoWzFdID09ICJzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyI6CiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfbXVsdGlwYXJ0X3VwbG9hZCA9IFRydWUKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IHNldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzIikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIjoKICAgICAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICAgICAgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gKAogICAgICAgICAgICAgICAgX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoX3J1bnRpbWUubG9jaywgcGFyYW1zKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAic2V0IGF0X2NyZWF0ZV9tdWx0aV9wYXJ0X3VwbG9hZCAlcyIsCiAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAicmVzZXQiOgogICAgICAgICAgICBfcnVudGltZS5yZXNldCgpCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInJlc2V0IikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICBkZWYgZG9fR0VUKHNlbGYpOgogICAgICAgIGlmIHNlbGYucGF0aCA9PSAiLyI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9waW5nKCkKCiAgICAgICAgaWYgc2VsZi5wYXRoLnN0YXJ0c3dpdGgoIi9tb2NrX3NldHRpbmdzIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2NrX3NldHRpbmdzKCkKCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiZ2V0IHJlZGlyZWN0IikKICAgICAgICByZXR1cm4gc2VsZi5yZWRpcmVjdCgpCgogICAgZGVmIGRvX1BVVChzZWxmKToKICAgICAgICBjb250ZW50X2xlbmd0aCA9IGludChzZWxmLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIsIDApKQoKICAgICAgICBpZiBfcnVudGltZS5zbG93X3B1dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGltZW91dCA9IF9ydW50aW1lLnNsb3dfcHV0LmdldF90aW1lb3V0KGNvbnRlbnRfbGVuZ3RoKQogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2xvdyBwdXQgJXMiLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0KQoKICAgICAgICBwYXJ0cyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdChzZWxmLnBhdGgpCiAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KCiAgICAgICAgaWYgdXBsb2FkX2lkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgInB1dCBhdF9wYXJ0X3VwbG9hZCAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICB1cGxvYWRfaWQsCiAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQuaGFzX2VmZmVjdCgpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZC5pbmplY3RfZXJyb3Ioc2VsZikKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuaXNfZmFrZV91cGxvYWQodXBsb2FkX2lkLCBwYXJ0cy5wYXRoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wdXRfb2soKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGVycm9yX2F0X29iamVjdF91cGxvYWQgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuYXRfb2JqZWN0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQogICAgICAgICAgICBpZiBfcnVudGltZS5mYWtlX3B1dF93aGVuX2xlbmd0aF9iaWdnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBjb250ZW50X2xlbmd0aCA+IF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuZmFrZV9wdXRfd2hlbl9sZW5ndGhfYmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3B1dF9vaygpCgogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICJwdXQgcmVkaXJlY3QgJXMiLAogICAgICAgICAgICBwYXJ0cywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYucmVkaXJlY3QoKQoKICAgIGRlZiBkb19QT1NUKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPVRydWUpCiAgICAgICAgdXBsb2FkcyA9IHBhcmFtcy5nZXQoInVwbG9hZHMiLCBbTm9uZV0pWzBdCiAgICAgICAgaWYgdXBsb2FkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQoKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgdXBsb2FkX2lkID0gZ2V0X3JhbmRvbV9zdHJpbmcoNSkKICAgICAgICAgICAgICAgIF9ydW50aW1lLnJlZ2lzdGVyX2Zha2VfdXBsb2FkKHVwbG9hZF9pZCwgcGFydHMucGF0aCkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3VwbG9hZHMocGFydHMucGF0aCwgdXBsb2FkX2lkKQoKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KICAgICAgICBpZiBfcnVudGltZS5pc19mYWtlX3VwbG9hZCh1cGxvYWRfaWQsIHBhcnRzLnBhdGgpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wb3N0X29rKHBhcnRzLnBhdGgpCgogICAgICAgIHJldHVybiBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fSEVBRChzZWxmKToKICAgICAgICBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fREVMRVRFKHNlbGYpOgogICAgICAgIHNlbGYucmVkaXJlY3QoKQoKCmNsYXNzIF9UaHJlYWRlZEhUVFBTZXJ2ZXIoc29ja2V0c2VydmVyLlRocmVhZGluZ01peEluLCBodHRwLnNlcnZlci5IVFRQU2VydmVyKToKICAgICIiIkhhbmRsZSByZXF1ZXN0cyBpbiBhIHNlcGFyYXRlIHRocmVhZC4iIiIKCiAgICBkZWYgc2V0X3Vwc3RyZWFtKHNlbGYsIHVwc3RyZWFtX2hvc3QsIHVwc3RyZWFtX3BvcnQpOgogICAgICAgIHNlbGYudXBzdHJlYW1faG9zdCA9IHVwc3RyZWFtX2hvc3QKICAgICAgICBzZWxmLnVwc3RyZWFtX3BvcnQgPSB1cHN0cmVhbV9wb3J0CgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGh0dHBkID0gX1RocmVhZGVkSFRUUFNlcnZlcigoIjAuMC4wLjAiLCBpbnQoc3lzLmFyZ3ZbMV0pKSwgUmVxdWVzdEhhbmRsZXIpCiAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDQ6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKHN5cy5hcmd2WzJdLCBzeXMuYXJndlszXSkKICAgIGVsc2U6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKCJtaW5pbzEiLCA5MDAxKQogICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCg== | base64 --decode > broken_s3.py'] run container_id:roottestmergetrees3_resolver_1 detach:True nothrow:False cmd: ['python', 'broken_s3.py', '8083'] run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/'] Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/'] Exitcode:7 run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/'] Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/'] Stdout:OK broken_s3.py answered OK on attempt 2 Mock server broken_s3.py started http://172.16.10.5:9001 "GET /root?delimiter=&encoding-type=url&list-type=2&max-keys=1000&prefix=data%2F HTTP/1.1" 200 0 list_objects (0): [] run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/mock_settings/reset'] Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/mock_settings/reset'] Stdout:OK ------------------------------ Captured log setup ------------------------------ 2024-05-01 12:24:23 [ 398 ] INFO : Starting mock server broken_s3.py (mock_servers.py:18, start_mock_servers) 2024-05-01 12:24:23 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:False cmd: ['bash', '-c', 'echo aW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCByYW5kb20KaW1wb3J0IHRpbWUKaW1wb3J0IHVybGxpYi5wYXJzZQppbXBvcnQgaHR0cC5zZXJ2ZXIKaW1wb3J0IHNvY2tldHNlcnZlcgppbXBvcnQgc3RyaW5nCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN0cnVjdAoKCklORl9DT1VOVCA9IDEwMDAwMDAwMAoKCmRlZiBfYW5kX3RoZW4odmFsdWUsIGZ1bmMpOgogICAgYXNzZXJ0IGNhbGxhYmxlKGZ1bmMpCiAgICByZXR1cm4gTm9uZSBpZiB2YWx1ZSBpcyBOb25lIGVsc2UgZnVuYyh2YWx1ZSkKCgpjbGFzcyBNb2NrQ29udHJvbDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbHVzdGVyLCBjb250YWluZXIsIHBvcnQpOgogICAgICAgIHNlbGYuX2NsdXN0ZXIgPSBjbHVzdGVyCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gY29udGFpbmVyCiAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9yZXNldCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2FjdGlvbihzZWxmLCB3aGVuLCBjb3VudD1Ob25lLCBhZnRlcj1Ob25lLCBhY3Rpb249Tm9uZSwgYWN0aW9uX2FyZ3M9Tm9uZSk6CiAgICAgICAgdXJsID0gZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3t3aGVufT9ub3RoaW5nPTEiCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgaWYgYWZ0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhZnRlcj17YWZ0ZXJ9IgoKICAgICAgICBpZiBhY3Rpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb249e2FjdGlvbn0iCgogICAgICAgIGlmIGFjdGlvbl9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgeCBpbiBhY3Rpb25fYXJnczoKICAgICAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb25fYXJncz17eH0iCgogICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY2x1c3Rlci5leGVjX2luX2NvbnRhaW5lcigKICAgICAgICAgICAgc2VsZi5fY2x1c3Rlci5nZXRfY29udGFpbmVyX2lkKHNlbGYuX2NvbnRhaW5lciksCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICJjdXJsIiwKICAgICAgICAgICAgICAgICItcyIsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2F0X29iamVjdF91cGxvYWQoc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuc2V0dXBfYWN0aW9uKCJhdF9vYmplY3RfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2F0X3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfcGFydF91cGxvYWQiLCAqKmt3YXJncykKCiAgICBkZWYgc2V0dXBfYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2Zha2VfcHV0cyhzZWxmLCBwYXJ0X2xlbmd0aCk6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9mYWtlX3B1dHM/d2hlbl9sZW5ndGhfYmlnZ2VyPXtwYXJ0X2xlbmd0aH0iLAogICAgICAgICAgICBdLAogICAgICAgICAgICBub3Rocm93PVRydWUsCiAgICAgICAgKQogICAgICAgIGFzc2VydCByZXNwb25zZSA9PSAiT0siLCByZXNwb25zZQoKICAgIGRlZiBzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyhzZWxmKToKICAgICAgICByZXNwb25zZSA9IHNlbGYuX2NsdXN0ZXIuZXhlY19pbl9jb250YWluZXIoCiAgICAgICAgICAgIHNlbGYuX2NsdXN0ZXIuZ2V0X2NvbnRhaW5lcl9pZChzZWxmLl9jb250YWluZXIpLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY3VybCIsCiAgICAgICAgICAgICAgICAiLXMiLAogICAgICAgICAgICAgICAgZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3NldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzPyIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX3Nsb3dfYW5zd2VycygKICAgICAgICBzZWxmLCBtaW5pbWFsX2xlbmd0aD0wLCB0aW1lb3V0PU5vbmUsIHByb2JhYmlsaXR5PU5vbmUsIGNvdW50PU5vbmUKICAgICk6CiAgICAgICAgdXJsID0gKAogICAgICAgICAgICBmImh0dHA6Ly9sb2NhbGhvc3Q6e3NlbGYuX3BvcnR9LyIKICAgICAgICAgICAgZiJtb2NrX3NldHRpbmdzL3Nsb3dfcHV0IgogICAgICAgICAgICBmIj9taW5pbWFsX2xlbmd0aD17bWluaW1hbF9sZW5ndGh9IgogICAgICAgICkKCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnRpbWVvdXQ9e3RpbWVvdXR9IgoKICAgICAgICBpZiBwcm9iYWJpbGl0eSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnByb2JhYmlsaXR5PXtwcm9iYWJpbGl0eX0iCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWyJjdXJsIiwgIi1zIiwgdXJsXSwKICAgICAgICAgICAgbm90aHJvdz1UcnVlLAogICAgICAgICkKICAgICAgICBhc3NlcnQgcmVzcG9uc2UgPT0gIk9LIiwgcmVzcG9uc2UKCgpjbGFzcyBfU2VydmVyUnVudGltZToKICAgIGNsYXNzIFNsb3dQdXQ6CiAgICAgICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLAogICAgICAgICAgICBsb2NrLAogICAgICAgICAgICBwcm9iYWJpbGl0eV89Tm9uZSwKICAgICAgICAgICAgdGltZW91dF89Tm9uZSwKICAgICAgICAgICAgbWluaW1hbF9sZW5ndGhfPU5vbmUsCiAgICAgICAgICAgIGNvdW50Xz1Ob25lLAogICAgICAgICk6CiAgICAgICAgICAgIHNlbGYubG9jayA9IGxvY2sKICAgICAgICAgICAgc2VsZi5wcm9iYWJpbGl0eSA9IHByb2JhYmlsaXR5XyBpZiBwcm9iYWJpbGl0eV8gaXMgbm90IE5vbmUgZWxzZSAxCiAgICAgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXRfIGlmIHRpbWVvdXRfIGlzIG5vdCBOb25lIGVsc2UgMC4xCiAgICAgICAgICAgIHNlbGYubWluaW1hbF9sZW5ndGggPSBtaW5pbWFsX2xlbmd0aF8gaWYgbWluaW1hbF9sZW5ndGhfIGlzIG5vdCBOb25lIGVsc2UgMAogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAoKICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGYicHJvYmFiaWxpdHk6e3NlbGYucHJvYmFiaWxpdHl9IgogICAgICAgICAgICAgICAgZiIgdGltZW91dDp7c2VsZi50aW1lb3V0fSIKICAgICAgICAgICAgICAgIGYiIG1pbmltYWxfbGVuZ3RoOntzZWxmLm1pbmltYWxfbGVuZ3RofSIKICAgICAgICAgICAgICAgIGYiIGNvdW50OntzZWxmLmNvdW50fSIKICAgICAgICAgICAgKQoKICAgICAgICBkZWYgZ2V0X3RpbWVvdXQoc2VsZiwgY29udGVudF9sZW5ndGgpOgogICAgICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfbGVuZ3RoID4gc2VsZi5taW5pbWFsX2xlbmd0aDoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuc2xvd19wdXQucHJvYmFiaWxpdHkgPT0gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcmFuZG9tLnJhbmRvbSgpIDw9IF9ydW50aW1lLnNsb3dfcHV0LnByb2JhYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50IC09IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5zbG93X3B1dC50aW1lb3V0CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgY2xhc3MgRXhwZWN0ZWQ1MDBFcnJvckFjdGlvbjoKICAgICAgICBkZWYgaW5qZWN0X2Vycm9yKHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CiAgICAgICAgICAgIGRhdGEgPSAoCiAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nCiAgICAgICAgICAgICAgICAiPEVycm9yPiIKICAgICAgICAgICAgICAgICI8Q29kZT5FeHBlY3RlZEVycm9yPC9Db2RlPiIKICAgICAgICAgICAgICAgICI8TWVzc2FnZT5tb2NrIHMzIGluamVjdGVkIGVycm9yPC9NZXNzYWdlPiIKICAgICAgICAgICAgICAgICI8UmVxdWVzdElkPnR4ZmJkNTY2ZDAzMDQyNDc0ODg4MTkzLTAwNjA4ZDc1Mzc8L1JlcXVlc3RJZD4iCiAgICAgICAgICAgICAgICAiPC9FcnJvcj4iCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndyaXRlX2Vycm9yKGRhdGEpCgogICAgY2xhc3MgUmVkaXJlY3RBY3Rpb246CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9ImxvY2FsaG9zdCIsIHBvcnQ9MSk6CiAgICAgICAgICAgIHNlbGYuZHN0X2hvc3QgPSBfYW5kX3RoZW4oaG9zdCwgc3RyKQogICAgICAgICAgICBzZWxmLmRzdF9wb3J0ID0gX2FuZF90aGVuKHBvcnQsIGludCkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVkaXJlY3QoaG9zdD1zZWxmLmRzdF9ob3N0LCBwb3J0PXNlbGYuZHN0X3BvcnQpCgogICAgY2xhc3MgQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aXRoX3BhcnRpYWxfZGF0YT1Ob25lKToKICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAiIgogICAgICAgICAgICBpZiB3aXRoX3BhcnRpYWxfZGF0YSBpcyBub3QgTm9uZSBhbmQgd2l0aF9wYXJ0aWFsX2RhdGEgPT0gIjEiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICAgICAgICAgIjxJbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD5cbiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICAgICAgaWYgc2VsZi5wYXJ0aWFsX2RhdGE6CiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgMTAwMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuZW5kX2hlYWRlcnMoKQogICAgICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndmaWxlLndyaXRlKGJ5dGVzKHNlbGYucGFydGlhbF9kYXRhLCAiVVRGLTgiKSkKCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uc2V0c29ja29wdCgKICAgICAgICAgICAgICAgIHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fTElOR0VSLCBzdHJ1Y3QucGFjaygiaWkiLCAxLCAwKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5jb25uZWN0aW9uLmNsb3NlKCkKCiAgICBjbGFzcyBCcm9rZW5QaXBlQWN0aW9uOgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgIyBwYXJ0aWFsIHJlYWQKICAgICAgICAgICAgc2VsZi5yZmlsZS5yZWFkKDUwKQoKICAgICAgICAgICAgdGltZS5zbGVlcCgxKQogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuY29ubmVjdGlvbi5zZXRzb2Nrb3B0KAogICAgICAgICAgICAgICAgc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19MSU5HRVIsIHN0cnVjdC5wYWNrKCJpaSIsIDEsIDApCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uY2xvc2UoKQoKICAgIGNsYXNzIENvbm5lY3Rpb25SZWZ1c2VkQWN0aW9uKFJlZGlyZWN0QWN0aW9uKToKICAgICAgICBwYXNzCgogICAgY2xhc3MgQ291bnRBZnRlcjoKICAgICAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2ssIGNvdW50Xz1Ob25lLCBhZnRlcl89Tm9uZSwgYWN0aW9uXz1Ob25lLCBhY3Rpb25fYXJnc189W10KICAgICAgICApOgogICAgICAgICAgICBzZWxmLmxvY2sgPSBsb2NrCgogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAogICAgICAgICAgICBzZWxmLmFmdGVyID0gYWZ0ZXJfIGlmIGFmdGVyXyBpcyBub3QgTm9uZSBlbHNlIDAKICAgICAgICAgICAgc2VsZi5hY3Rpb24gPSBhY3Rpb25fCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX2FyZ3MgPSBhY3Rpb25fYXJnc18KCiAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3JlZnVzZWQiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlZnVzZWRBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3Jlc2V0X2J5X3BlZXIiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uKAogICAgICAgICAgICAgICAgICAgICpzZWxmLmFjdGlvbl9hcmdzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgc2VsZi5hY3Rpb24gPT0gImJyb2tlbl9waXBlIjoKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkJyb2tlblBpcGVBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJyZWRpcmVjdF90byI6CiAgICAgICAgICAgICAgICBzZWxmLmVycm9yX2hhbmRsZXIgPSBfU2VydmVyUnVudGltZS5SZWRpcmVjdEFjdGlvbigqc2VsZi5hY3Rpb25fYXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkV4cGVjdGVkNTAwRXJyb3JBY3Rpb24oKQoKICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgZGVmIGZyb21fY2dpX3BhcmFtcyhsb2NrLCBwYXJhbXMpOgogICAgICAgICAgICByZXR1cm4gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlcigKICAgICAgICAgICAgICAgIGxvY2s9bG9jaywKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICAgICAgYWZ0ZXJfPV9hbmRfdGhlbihwYXJhbXMuZ2V0KCJhZnRlciIsIFtOb25lXSlbMF0sIGludCksCiAgICAgICAgICAgICAgICBhY3Rpb25fPXBhcmFtcy5nZXQoImFjdGlvbiIsIFtOb25lXSlbMF0sCiAgICAgICAgICAgICAgICBhY3Rpb25fYXJnc189cGFyYW1zLmdldCgiYWN0aW9uX2FyZ3MiLCBbXSksCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBmImNvdW50OntzZWxmLmNvdW50fSBhZnRlcjp7c2VsZi5hZnRlcn0gYWN0aW9uOntzZWxmLmFjdGlvbn0gYWN0aW9uX2FyZ3M6e3NlbGYuYWN0aW9uX2FyZ3N9IgoKICAgICAgICBkZWYgaGFzX2VmZmVjdChzZWxmKToKICAgICAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmFmdGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXIgLT0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5hZnRlciA9PSAwOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY291bnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQgLT0gMQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyLmluamVjdF9lcnJvcihyZXF1ZXN0X2hhbmRsZXIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmF0X3BhcnRfdXBsb2FkID0gTm9uZQogICAgICAgIHNlbGYuYXRfb2JqZWN0X3VwbG9hZCA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfdXBsb2FkcyA9IGRpY3QoKQogICAgICAgIHNlbGYuc2xvd19wdXQgPSBOb25lCiAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgc2VsZi5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQgPSBOb25lCgogICAgZGVmIHJlZ2lzdGVyX2Zha2VfdXBsb2FkKHNlbGYsIHVwbG9hZF9pZCwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHNbdXBsb2FkX2lkXSA9IGtleQoKICAgIGRlZiBpc19mYWtlX3VwbG9hZChzZWxmLCB1cGxvYWRfaWQsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGlmIHVwbG9hZF9pZCBpbiBzZWxmLmZha2VfdXBsb2FkczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZha2VfdXBsb2Fkc1t1cGxvYWRfaWRdID09IGtleQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5hdF9wYXJ0X3VwbG9hZCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5hdF9vYmplY3RfdXBsb2FkID0gTm9uZQogICAgICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHMgPSBkaWN0KCkKICAgICAgICAgICAgc2VsZi5zbG93X3B1dCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gTm9uZQoKCl9ydW50aW1lID0gX1NlcnZlclJ1bnRpbWUoKQoKCmRlZiBnZXRfcmFuZG9tX3N0cmluZyhsZW5ndGgpOgogICAgIyBjaG9vc2UgZnJvbSBhbGwgbG93ZXJjYXNlIGxldHRlcgogICAgbGV0dGVycyA9IHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKICAgIHJlc3VsdF9zdHIgPSAiIi5qb2luKHJhbmRvbS5jaG9pY2UobGV0dGVycykgZm9yIGkgaW4gcmFuZ2UobGVuZ3RoKSkKICAgIHJldHVybiByZXN1bHRfc3RyCgoKY2xhc3MgUmVxdWVzdEhhbmRsZXIoaHR0cC5zZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CiAgICBkZWYgX29rKHNlbGYpOgogICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYiJPSyIpCgogICAgZGVmIF9waW5nKHNlbGYpOgogICAgICAgIHNlbGYuX29rKCkKCiAgICBkZWYgcmVhZF9hbGxfaW5wdXQoc2VsZik6CiAgICAgICAgY29udGVudF9sZW5ndGggPSBpbnQoc2VsZi5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiLCAwKSkKICAgICAgICB0b19yZWFkID0gY29udGVudF9sZW5ndGgKICAgICAgICB3aGlsZSB0b19yZWFkID4gMDoKICAgICAgICAgICAgIyByZWFkIGNvbnRlbnQgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb3Igb24gY2xpZW50CiAgICAgICAgICAgICMgUG9jbzo6RXhjZXB0aW9uLiBDb2RlOiAxMDAwLCBlLmNvZGUoKSA9IDMyLCBJL08gZXJyb3I6IEJyb2tlbiBwaXBlCiAgICAgICAgICAgICMgZG8gaXQgcGllY2UgYnkgcGllY2UgaW4gb3JkZXIgdG8gYXZvaWQgYmlnIGFsbG9jYXRpb24KICAgICAgICAgICAgc2l6ZSA9IG1pbih0b19yZWFkLCAxMDI0KQogICAgICAgICAgICBzdHIoc2VsZi5yZmlsZS5yZWFkKHNpemUpKQogICAgICAgICAgICB0b19yZWFkIC09IHNpemUKCiAgICBkZWYgcmVkaXJlY3Qoc2VsZiwgaG9zdD1Ob25lLCBwb3J0PU5vbmUpOgogICAgICAgIGlmIGhvc3QgaXMgTm9uZSBhbmQgcG9ydCBpcyBOb25lOgogICAgICAgICAgICBob3N0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1faG9zdAogICAgICAgICAgICBwb3J0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1fcG9ydAoKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKCiAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDMwNykKICAgICAgICB1cmwgPSBmImh0dHA6Ly97aG9zdH06e3BvcnR9e3NlbGYucGF0aH0iCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgicmVkaXJlY3QgdG8gJXMiLCB1cmwpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiTG9jYXRpb24iLCB1cmwpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgc2VsZi53ZmlsZS53cml0ZShiIlJlZGlyZWN0ZWQiKQoKICAgIGRlZiB3cml0ZV9lcnJvcihzZWxmLCBkYXRhLCBjb250ZW50X2xlbmd0aD1Ob25lKToKICAgICAgICBpZiBjb250ZW50X2xlbmd0aCBpcyBOb25lOgogICAgICAgICAgICBjb250ZW50X2xlbmd0aCA9IGxlbihkYXRhKQogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIndyaXRlX2Vycm9yICVzIiwgZGF0YSkKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIoY29udGVudF9sZW5ndGgpKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3B1dF9vayhzZWxmKToKICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJmYWtlIHB1dCIpCgogICAgICAgIHNlbGYucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiRVRhZyIsICJiNTQzNTdmYWYwNjMyY2NlNDZlOTQyZmE2ODM1NmIzOCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCAwKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQoKICAgIGRlZiBfZmFrZV91cGxvYWRzKHNlbGYsIHBhdGgsIHVwbG9hZF9pZCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8SW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPEJ1Y2tldD57YnVja2V0fTwvQnVja2V0PiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+IgogICAgICAgICAgICBmIjxVcGxvYWRJZD57dXBsb2FkX2lkfTwvVXBsb2FkSWQ+IgogICAgICAgICAgICAiPC9Jbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3Bvc3Rfb2soc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgbG9jYXRpb24gPSAiaHR0cDovL0V4YW1wbGUtQnVja2V0LnMzLlJlZ2lvbi5hbWF6b25hd3MuY29tLyIgKyBwYXRoCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPExvY2F0aW9uPntsb2NhdGlvbn08L0xvY2F0aW9uPlxuIgogICAgICAgICAgICBmIjxCdWNrZXQ+e2J1Y2tldH08L0J1Y2tldD5cbiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+XG4iCiAgICAgICAgICAgIGYnPEVUYWc+IjM4NThmNjIyMzBhYzNjOTE1ZjMwMGM2NjQzMTJjMTFmLTkiPC9FVGFnPlxuJwogICAgICAgICAgICBmIjwvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9tb2NrX3NldHRpbmdzKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXRoID0gW3ggZm9yIHggaW4gcGFydHMucGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYXNzZXJ0IHBhdGhbMF0gPT0gIm1vY2tfc2V0dGluZ3MiLCBwYXRoCiAgICAgICAgaWYgbGVuKHBhdGgpIDwgMjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfcGFydF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCA9IF9TZXJ2ZXJSdW50aW1lLkNvdW50QWZ0ZXIuZnJvbV9jZ2lfcGFyYW1zKAogICAgICAgICAgICAgICAgX3J1bnRpbWUubG9jaywgcGFyYW1zCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGF0X3BhcnRfdXBsb2FkICVzIiwgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImF0X29iamVjdF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkID0gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoCiAgICAgICAgICAgICAgICBfcnVudGltZS5sb2NrLCBwYXJhbXMKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJzZXQgYXRfb2JqZWN0X3VwbG9hZCAlcyIsIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImZha2VfcHV0cyI6CiAgICAgICAgICAgIHBhcmFtcyA9IHVybGxpYi5wYXJzZS5wYXJzZV9xcyhwYXJ0cy5xdWVyeSwga2VlcF9ibGFua192YWx1ZXM9RmFsc2UpCiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IGludCgKICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoIndoZW5fbGVuZ3RoX2JpZ2dlciIsIFsxMDI0ICogMTAyNF0pWzBdCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGZha2VfcHV0cyAlcyIsIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAic2xvd19wdXQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5zbG93X3B1dCA9IF9TZXJ2ZXJSdW50aW1lLlNsb3dQdXQoCiAgICAgICAgICAgICAgICBsb2NrPV9ydW50aW1lLmxvY2ssCiAgICAgICAgICAgICAgICBtaW5pbWFsX2xlbmd0aF89X2FuZF90aGVuKHBhcmFtcy5nZXQoIm1pbmltYWxfbGVuZ3RoIiwgW05vbmVdKVswXSwgaW50KSwKICAgICAgICAgICAgICAgIHByb2JhYmlsaXR5Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgicHJvYmFiaWxpdHkiLCBbTm9uZV0pWzBdLCBmbG9hdCksCiAgICAgICAgICAgICAgICB0aW1lb3V0Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgidGltZW91dCIsIFtOb25lXSlbMF0sIGZsb2F0KSwKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInNldCBzbG93IHB1dCAlcyIsIF9ydW50aW1lLnNsb3dfcHV0KQogICAgICAgICAgICByZXR1cm4gc2VsZi5fb2soKQoKICAgICAgICBpZiBwYXRoWzFdID09ICJzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyI6CiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfbXVsdGlwYXJ0X3VwbG9hZCA9IFRydWUKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IHNldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzIikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIjoKICAgICAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICAgICAgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gKAogICAgICAgICAgICAgICAgX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoX3J1bnRpbWUubG9jaywgcGFyYW1zKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAic2V0IGF0X2NyZWF0ZV9tdWx0aV9wYXJ0X3VwbG9hZCAlcyIsCiAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAicmVzZXQiOgogICAgICAgICAgICBfcnVudGltZS5yZXNldCgpCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInJlc2V0IikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICBkZWYgZG9fR0VUKHNlbGYpOgogICAgICAgIGlmIHNlbGYucGF0aCA9PSAiLyI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9waW5nKCkKCiAgICAgICAgaWYgc2VsZi5wYXRoLnN0YXJ0c3dpdGgoIi9tb2NrX3NldHRpbmdzIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2NrX3NldHRpbmdzKCkKCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiZ2V0IHJlZGlyZWN0IikKICAgICAgICByZXR1cm4gc2VsZi5yZWRpcmVjdCgpCgogICAgZGVmIGRvX1BVVChzZWxmKToKICAgICAgICBjb250ZW50X2xlbmd0aCA9IGludChzZWxmLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIsIDApKQoKICAgICAgICBpZiBfcnVudGltZS5zbG93X3B1dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGltZW91dCA9IF9ydW50aW1lLnNsb3dfcHV0LmdldF90aW1lb3V0KGNvbnRlbnRfbGVuZ3RoKQogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2xvdyBwdXQgJXMiLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0KQoKICAgICAgICBwYXJ0cyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdChzZWxmLnBhdGgpCiAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KCiAgICAgICAgaWYgdXBsb2FkX2lkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgInB1dCBhdF9wYXJ0X3VwbG9hZCAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICB1cGxvYWRfaWQsCiAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQuaGFzX2VmZmVjdCgpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZC5pbmplY3RfZXJyb3Ioc2VsZikKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuaXNfZmFrZV91cGxvYWQodXBsb2FkX2lkLCBwYXJ0cy5wYXRoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wdXRfb2soKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGVycm9yX2F0X29iamVjdF91cGxvYWQgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuYXRfb2JqZWN0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQogICAgICAgICAgICBpZiBfcnVudGltZS5mYWtlX3B1dF93aGVuX2xlbmd0aF9iaWdnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBjb250ZW50X2xlbmd0aCA+IF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuZmFrZV9wdXRfd2hlbl9sZW5ndGhfYmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3B1dF9vaygpCgogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICJwdXQgcmVkaXJlY3QgJXMiLAogICAgICAgICAgICBwYXJ0cywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYucmVkaXJlY3QoKQoKICAgIGRlZiBkb19QT1NUKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPVRydWUpCiAgICAgICAgdXBsb2FkcyA9IHBhcmFtcy5nZXQoInVwbG9hZHMiLCBbTm9uZV0pWzBdCiAgICAgICAgaWYgdXBsb2FkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQoKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgdXBsb2FkX2lkID0gZ2V0X3JhbmRvbV9zdHJpbmcoNSkKICAgICAgICAgICAgICAgIF9ydW50aW1lLnJlZ2lzdGVyX2Zha2VfdXBsb2FkKHVwbG9hZF9pZCwgcGFydHMucGF0aCkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3VwbG9hZHMocGFydHMucGF0aCwgdXBsb2FkX2lkKQoKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KICAgICAgICBpZiBfcnVudGltZS5pc19mYWtlX3VwbG9hZCh1cGxvYWRfaWQsIHBhcnRzLnBhdGgpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wb3N0X29rKHBhcnRzLnBhdGgpCgogICAgICAgIHJldHVybiBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fSEVBRChzZWxmKToKICAgICAgICBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fREVMRVRFKHNlbGYpOgogICAgICAgIHNlbGYucmVkaXJlY3QoKQoKCmNsYXNzIF9UaHJlYWRlZEhUVFBTZXJ2ZXIoc29ja2V0c2VydmVyLlRocmVhZGluZ01peEluLCBodHRwLnNlcnZlci5IVFRQU2VydmVyKToKICAgICIiIkhhbmRsZSByZXF1ZXN0cyBpbiBhIHNlcGFyYXRlIHRocmVhZC4iIiIKCiAgICBkZWYgc2V0X3Vwc3RyZWFtKHNlbGYsIHVwc3RyZWFtX2hvc3QsIHVwc3RyZWFtX3BvcnQpOgogICAgICAgIHNlbGYudXBzdHJlYW1faG9zdCA9IHVwc3RyZWFtX2hvc3QKICAgICAgICBzZWxmLnVwc3RyZWFtX3BvcnQgPSB1cHN0cmVhbV9wb3J0CgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGh0dHBkID0gX1RocmVhZGVkSFRUUFNlcnZlcigoIjAuMC4wLjAiLCBpbnQoc3lzLmFyZ3ZbMV0pKSwgUmVxdWVzdEhhbmRsZXIpCiAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDQ6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKHN5cy5hcmd2WzJdLCBzeXMuYXJndlszXSkKICAgIGVsc2U6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKCJtaW5pbzEiLCA5MDAxKQogICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCg== | base64 --decode > broken_s3.py'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:23 [ 398 ] DEBUG : Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'bash', '-c', 'echo aW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCByYW5kb20KaW1wb3J0IHRpbWUKaW1wb3J0IHVybGxpYi5wYXJzZQppbXBvcnQgaHR0cC5zZXJ2ZXIKaW1wb3J0IHNvY2tldHNlcnZlcgppbXBvcnQgc3RyaW5nCmltcG9ydCBzb2NrZXQKaW1wb3J0IHN0cnVjdAoKCklORl9DT1VOVCA9IDEwMDAwMDAwMAoKCmRlZiBfYW5kX3RoZW4odmFsdWUsIGZ1bmMpOgogICAgYXNzZXJ0IGNhbGxhYmxlKGZ1bmMpCiAgICByZXR1cm4gTm9uZSBpZiB2YWx1ZSBpcyBOb25lIGVsc2UgZnVuYyh2YWx1ZSkKCgpjbGFzcyBNb2NrQ29udHJvbDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbHVzdGVyLCBjb250YWluZXIsIHBvcnQpOgogICAgICAgIHNlbGYuX2NsdXN0ZXIgPSBjbHVzdGVyCiAgICAgICAgc2VsZi5fY29udGFpbmVyID0gY29udGFpbmVyCiAgICAgICAgc2VsZi5fcG9ydCA9IHBvcnQKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9yZXNldCIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2FjdGlvbihzZWxmLCB3aGVuLCBjb3VudD1Ob25lLCBhZnRlcj1Ob25lLCBhY3Rpb249Tm9uZSwgYWN0aW9uX2FyZ3M9Tm9uZSk6CiAgICAgICAgdXJsID0gZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3t3aGVufT9ub3RoaW5nPTEiCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgaWYgYWZ0ZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhZnRlcj17YWZ0ZXJ9IgoKICAgICAgICBpZiBhY3Rpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb249e2FjdGlvbn0iCgogICAgICAgIGlmIGFjdGlvbl9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgeCBpbiBhY3Rpb25fYXJnczoKICAgICAgICAgICAgICAgIHVybCArPSBmIiZhY3Rpb25fYXJncz17eH0iCgogICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY2x1c3Rlci5leGVjX2luX2NvbnRhaW5lcigKICAgICAgICAgICAgc2VsZi5fY2x1c3Rlci5nZXRfY29udGFpbmVyX2lkKHNlbGYuX2NvbnRhaW5lciksCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICJjdXJsIiwKICAgICAgICAgICAgICAgICItcyIsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX2F0X29iamVjdF91cGxvYWQoc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuc2V0dXBfYWN0aW9uKCJhdF9vYmplY3RfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2F0X3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfcGFydF91cGxvYWQiLCAqKmt3YXJncykKCiAgICBkZWYgc2V0dXBfYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzZWxmLnNldHVwX2FjdGlvbigiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIiwgKiprd2FyZ3MpCgogICAgZGVmIHNldHVwX2Zha2VfcHV0cyhzZWxmLCBwYXJ0X2xlbmd0aCk6CiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgImN1cmwiLAogICAgICAgICAgICAgICAgIi1zIiwKICAgICAgICAgICAgICAgIGYiaHR0cDovL2xvY2FsaG9zdDp7c2VsZi5fcG9ydH0vbW9ja19zZXR0aW5ncy9mYWtlX3B1dHM/d2hlbl9sZW5ndGhfYmlnZ2VyPXtwYXJ0X2xlbmd0aH0iLAogICAgICAgICAgICBdLAogICAgICAgICAgICBub3Rocm93PVRydWUsCiAgICAgICAgKQogICAgICAgIGFzc2VydCByZXNwb25zZSA9PSAiT0siLCByZXNwb25zZQoKICAgIGRlZiBzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyhzZWxmKToKICAgICAgICByZXNwb25zZSA9IHNlbGYuX2NsdXN0ZXIuZXhlY19pbl9jb250YWluZXIoCiAgICAgICAgICAgIHNlbGYuX2NsdXN0ZXIuZ2V0X2NvbnRhaW5lcl9pZChzZWxmLl9jb250YWluZXIpLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAiY3VybCIsCiAgICAgICAgICAgICAgICAiLXMiLAogICAgICAgICAgICAgICAgZiJodHRwOi8vbG9jYWxob3N0OntzZWxmLl9wb3J0fS9tb2NrX3NldHRpbmdzL3NldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzPyIsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG5vdGhyb3c9VHJ1ZSwKICAgICAgICApCiAgICAgICAgYXNzZXJ0IHJlc3BvbnNlID09ICJPSyIsIHJlc3BvbnNlCgogICAgZGVmIHNldHVwX3Nsb3dfYW5zd2VycygKICAgICAgICBzZWxmLCBtaW5pbWFsX2xlbmd0aD0wLCB0aW1lb3V0PU5vbmUsIHByb2JhYmlsaXR5PU5vbmUsIGNvdW50PU5vbmUKICAgICk6CiAgICAgICAgdXJsID0gKAogICAgICAgICAgICBmImh0dHA6Ly9sb2NhbGhvc3Q6e3NlbGYuX3BvcnR9LyIKICAgICAgICAgICAgZiJtb2NrX3NldHRpbmdzL3Nsb3dfcHV0IgogICAgICAgICAgICBmIj9taW5pbWFsX2xlbmd0aD17bWluaW1hbF9sZW5ndGh9IgogICAgICAgICkKCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnRpbWVvdXQ9e3RpbWVvdXR9IgoKICAgICAgICBpZiBwcm9iYWJpbGl0eSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGYiJnByb2JhYmlsaXR5PXtwcm9iYWJpbGl0eX0iCgogICAgICAgIGlmIGNvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gZiImY291bnQ9e2NvdW50fSIKCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jbHVzdGVyLmV4ZWNfaW5fY29udGFpbmVyKAogICAgICAgICAgICBzZWxmLl9jbHVzdGVyLmdldF9jb250YWluZXJfaWQoc2VsZi5fY29udGFpbmVyKSwKICAgICAgICAgICAgWyJjdXJsIiwgIi1zIiwgdXJsXSwKICAgICAgICAgICAgbm90aHJvdz1UcnVlLAogICAgICAgICkKICAgICAgICBhc3NlcnQgcmVzcG9uc2UgPT0gIk9LIiwgcmVzcG9uc2UKCgpjbGFzcyBfU2VydmVyUnVudGltZToKICAgIGNsYXNzIFNsb3dQdXQ6CiAgICAgICAgZGVmIF9faW5pdF9fKAogICAgICAgICAgICBzZWxmLAogICAgICAgICAgICBsb2NrLAogICAgICAgICAgICBwcm9iYWJpbGl0eV89Tm9uZSwKICAgICAgICAgICAgdGltZW91dF89Tm9uZSwKICAgICAgICAgICAgbWluaW1hbF9sZW5ndGhfPU5vbmUsCiAgICAgICAgICAgIGNvdW50Xz1Ob25lLAogICAgICAgICk6CiAgICAgICAgICAgIHNlbGYubG9jayA9IGxvY2sKICAgICAgICAgICAgc2VsZi5wcm9iYWJpbGl0eSA9IHByb2JhYmlsaXR5XyBpZiBwcm9iYWJpbGl0eV8gaXMgbm90IE5vbmUgZWxzZSAxCiAgICAgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXRfIGlmIHRpbWVvdXRfIGlzIG5vdCBOb25lIGVsc2UgMC4xCiAgICAgICAgICAgIHNlbGYubWluaW1hbF9sZW5ndGggPSBtaW5pbWFsX2xlbmd0aF8gaWYgbWluaW1hbF9sZW5ndGhfIGlzIG5vdCBOb25lIGVsc2UgMAogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAoKICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIGYicHJvYmFiaWxpdHk6e3NlbGYucHJvYmFiaWxpdHl9IgogICAgICAgICAgICAgICAgZiIgdGltZW91dDp7c2VsZi50aW1lb3V0fSIKICAgICAgICAgICAgICAgIGYiIG1pbmltYWxfbGVuZ3RoOntzZWxmLm1pbmltYWxfbGVuZ3RofSIKICAgICAgICAgICAgICAgIGYiIGNvdW50OntzZWxmLmNvdW50fSIKICAgICAgICAgICAgKQoKICAgICAgICBkZWYgZ2V0X3RpbWVvdXQoc2VsZiwgY29udGVudF9sZW5ndGgpOgogICAgICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRfbGVuZ3RoID4gc2VsZi5taW5pbWFsX2xlbmd0aDoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuc2xvd19wdXQucHJvYmFiaWxpdHkgPT0gMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcmFuZG9tLnJhbmRvbSgpIDw9IF9ydW50aW1lLnNsb3dfcHV0LnByb2JhYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50IC09IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5zbG93X3B1dC50aW1lb3V0CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgY2xhc3MgRXhwZWN0ZWQ1MDBFcnJvckFjdGlvbjoKICAgICAgICBkZWYgaW5qZWN0X2Vycm9yKHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CiAgICAgICAgICAgIGRhdGEgPSAoCiAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4nCiAgICAgICAgICAgICAgICAiPEVycm9yPiIKICAgICAgICAgICAgICAgICI8Q29kZT5FeHBlY3RlZEVycm9yPC9Db2RlPiIKICAgICAgICAgICAgICAgICI8TWVzc2FnZT5tb2NrIHMzIGluamVjdGVkIGVycm9yPC9NZXNzYWdlPiIKICAgICAgICAgICAgICAgICI8UmVxdWVzdElkPnR4ZmJkNTY2ZDAzMDQyNDc0ODg4MTkzLTAwNjA4ZDc1Mzc8L1JlcXVlc3RJZD4iCiAgICAgICAgICAgICAgICAiPC9FcnJvcj4iCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndyaXRlX2Vycm9yKGRhdGEpCgogICAgY2xhc3MgUmVkaXJlY3RBY3Rpb246CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9ImxvY2FsaG9zdCIsIHBvcnQ9MSk6CiAgICAgICAgICAgIHNlbGYuZHN0X2hvc3QgPSBfYW5kX3RoZW4oaG9zdCwgc3RyKQogICAgICAgICAgICBzZWxmLmRzdF9wb3J0ID0gX2FuZF90aGVuKHBvcnQsIGludCkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVkaXJlY3QoaG9zdD1zZWxmLmRzdF9ob3N0LCBwb3J0PXNlbGYuZHN0X3BvcnQpCgogICAgY2xhc3MgQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aXRoX3BhcnRpYWxfZGF0YT1Ob25lKToKICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAiIgogICAgICAgICAgICBpZiB3aXRoX3BhcnRpYWxfZGF0YSBpcyBub3QgTm9uZSBhbmQgd2l0aF9wYXJ0aWFsX2RhdGEgPT0gIjEiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJ0aWFsX2RhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICAgICAgICAgIjxJbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD5cbiIKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZGVmIGluamVjdF9lcnJvcihzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICAgICAgaWYgc2VsZi5wYXJ0aWFsX2RhdGE6CiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgMTAwMDApCiAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuZW5kX2hlYWRlcnMoKQogICAgICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLndmaWxlLndyaXRlKGJ5dGVzKHNlbGYucGFydGlhbF9kYXRhLCAiVVRGLTgiKSkKCiAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uc2V0c29ja29wdCgKICAgICAgICAgICAgICAgIHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fTElOR0VSLCBzdHJ1Y3QucGFjaygiaWkiLCAxLCAwKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5jb25uZWN0aW9uLmNsb3NlKCkKCiAgICBjbGFzcyBCcm9rZW5QaXBlQWN0aW9uOgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgIyBwYXJ0aWFsIHJlYWQKICAgICAgICAgICAgc2VsZi5yZmlsZS5yZWFkKDUwKQoKICAgICAgICAgICAgdGltZS5zbGVlcCgxKQogICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuY29ubmVjdGlvbi5zZXRzb2Nrb3B0KAogICAgICAgICAgICAgICAgc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19MSU5HRVIsIHN0cnVjdC5wYWNrKCJpaSIsIDEsIDApCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmNvbm5lY3Rpb24uY2xvc2UoKQoKICAgIGNsYXNzIENvbm5lY3Rpb25SZWZ1c2VkQWN0aW9uKFJlZGlyZWN0QWN0aW9uKToKICAgICAgICBwYXNzCgogICAgY2xhc3MgQ291bnRBZnRlcjoKICAgICAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGxvY2ssIGNvdW50Xz1Ob25lLCBhZnRlcl89Tm9uZSwgYWN0aW9uXz1Ob25lLCBhY3Rpb25fYXJnc189W10KICAgICAgICApOgogICAgICAgICAgICBzZWxmLmxvY2sgPSBsb2NrCgogICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnRfIGlmIGNvdW50XyBpcyBub3QgTm9uZSBlbHNlIElORl9DT1VOVAogICAgICAgICAgICBzZWxmLmFmdGVyID0gYWZ0ZXJfIGlmIGFmdGVyXyBpcyBub3QgTm9uZSBlbHNlIDAKICAgICAgICAgICAgc2VsZi5hY3Rpb24gPSBhY3Rpb25fCiAgICAgICAgICAgIHNlbGYuYWN0aW9uX2FyZ3MgPSBhY3Rpb25fYXJnc18KCiAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3JlZnVzZWQiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlZnVzZWRBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJjb25uZWN0aW9uX3Jlc2V0X2J5X3BlZXIiOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyID0gX1NlcnZlclJ1bnRpbWUuQ29ubmVjdGlvblJlc2V0QnlQZWVyQWN0aW9uKAogICAgICAgICAgICAgICAgICAgICpzZWxmLmFjdGlvbl9hcmdzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsaWYgc2VsZi5hY3Rpb24gPT0gImJyb2tlbl9waXBlIjoKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkJyb2tlblBpcGVBY3Rpb24oKQogICAgICAgICAgICBlbGlmIHNlbGYuYWN0aW9uID09ICJyZWRpcmVjdF90byI6CiAgICAgICAgICAgICAgICBzZWxmLmVycm9yX2hhbmRsZXIgPSBfU2VydmVyUnVudGltZS5SZWRpcmVjdEFjdGlvbigqc2VsZi5hY3Rpb25fYXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlciA9IF9TZXJ2ZXJSdW50aW1lLkV4cGVjdGVkNTAwRXJyb3JBY3Rpb24oKQoKICAgICAgICBAc3RhdGljbWV0aG9kCiAgICAgICAgZGVmIGZyb21fY2dpX3BhcmFtcyhsb2NrLCBwYXJhbXMpOgogICAgICAgICAgICByZXR1cm4gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlcigKICAgICAgICAgICAgICAgIGxvY2s9bG9jaywKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICAgICAgYWZ0ZXJfPV9hbmRfdGhlbihwYXJhbXMuZ2V0KCJhZnRlciIsIFtOb25lXSlbMF0sIGludCksCiAgICAgICAgICAgICAgICBhY3Rpb25fPXBhcmFtcy5nZXQoImFjdGlvbiIsIFtOb25lXSlbMF0sCiAgICAgICAgICAgICAgICBhY3Rpb25fYXJnc189cGFyYW1zLmdldCgiYWN0aW9uX2FyZ3MiLCBbXSksCiAgICAgICAgICAgICkKCiAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBmImNvdW50OntzZWxmLmNvdW50fSBhZnRlcjp7c2VsZi5hZnRlcn0gYWN0aW9uOntzZWxmLmFjdGlvbn0gYWN0aW9uX2FyZ3M6e3NlbGYuYWN0aW9uX2FyZ3N9IgoKICAgICAgICBkZWYgaGFzX2VmZmVjdChzZWxmKToKICAgICAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmFmdGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWZ0ZXIgLT0gMQogICAgICAgICAgICAgICAgaWYgc2VsZi5hZnRlciA9PSAwOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY291bnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQgLT0gMQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlZiBpbmplY3RfZXJyb3Ioc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVyLmluamVjdF9lcnJvcihyZXF1ZXN0X2hhbmRsZXIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmF0X3BhcnRfdXBsb2FkID0gTm9uZQogICAgICAgIHNlbGYuYXRfb2JqZWN0X3VwbG9hZCA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICBzZWxmLmZha2VfdXBsb2FkcyA9IGRpY3QoKQogICAgICAgIHNlbGYuc2xvd19wdXQgPSBOb25lCiAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgc2VsZi5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQgPSBOb25lCgogICAgZGVmIHJlZ2lzdGVyX2Zha2VfdXBsb2FkKHNlbGYsIHVwbG9hZF9pZCwga2V5KToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHNbdXBsb2FkX2lkXSA9IGtleQoKICAgIGRlZiBpc19mYWtlX3VwbG9hZChzZWxmLCB1cGxvYWRfaWQsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGlmIHVwbG9hZF9pZCBpbiBzZWxmLmZha2VfdXBsb2FkczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZha2VfdXBsb2Fkc1t1cGxvYWRfaWRdID09IGtleQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5hdF9wYXJ0X3VwbG9hZCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5hdF9vYmplY3RfdXBsb2FkID0gTm9uZQogICAgICAgICAgICBzZWxmLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX3VwbG9hZHMgPSBkaWN0KCkKICAgICAgICAgICAgc2VsZi5zbG93X3B1dCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5mYWtlX211bHRpcGFydF91cGxvYWQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gTm9uZQoKCl9ydW50aW1lID0gX1NlcnZlclJ1bnRpbWUoKQoKCmRlZiBnZXRfcmFuZG9tX3N0cmluZyhsZW5ndGgpOgogICAgIyBjaG9vc2UgZnJvbSBhbGwgbG93ZXJjYXNlIGxldHRlcgogICAgbGV0dGVycyA9IHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKICAgIHJlc3VsdF9zdHIgPSAiIi5qb2luKHJhbmRvbS5jaG9pY2UobGV0dGVycykgZm9yIGkgaW4gcmFuZ2UobGVuZ3RoKSkKICAgIHJldHVybiByZXN1bHRfc3RyCgoKY2xhc3MgUmVxdWVzdEhhbmRsZXIoaHR0cC5zZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CiAgICBkZWYgX29rKHNlbGYpOgogICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYiJPSyIpCgogICAgZGVmIF9waW5nKHNlbGYpOgogICAgICAgIHNlbGYuX29rKCkKCiAgICBkZWYgcmVhZF9hbGxfaW5wdXQoc2VsZik6CiAgICAgICAgY29udGVudF9sZW5ndGggPSBpbnQoc2VsZi5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiLCAwKSkKICAgICAgICB0b19yZWFkID0gY29udGVudF9sZW5ndGgKICAgICAgICB3aGlsZSB0b19yZWFkID4gMDoKICAgICAgICAgICAgIyByZWFkIGNvbnRlbnQgaW4gb3JkZXIgdG8gYXZvaWQgZXJyb3Igb24gY2xpZW50CiAgICAgICAgICAgICMgUG9jbzo6RXhjZXB0aW9uLiBDb2RlOiAxMDAwLCBlLmNvZGUoKSA9IDMyLCBJL08gZXJyb3I6IEJyb2tlbiBwaXBlCiAgICAgICAgICAgICMgZG8gaXQgcGllY2UgYnkgcGllY2UgaW4gb3JkZXIgdG8gYXZvaWQgYmlnIGFsbG9jYXRpb24KICAgICAgICAgICAgc2l6ZSA9IG1pbih0b19yZWFkLCAxMDI0KQogICAgICAgICAgICBzdHIoc2VsZi5yZmlsZS5yZWFkKHNpemUpKQogICAgICAgICAgICB0b19yZWFkIC09IHNpemUKCiAgICBkZWYgcmVkaXJlY3Qoc2VsZiwgaG9zdD1Ob25lLCBwb3J0PU5vbmUpOgogICAgICAgIGlmIGhvc3QgaXMgTm9uZSBhbmQgcG9ydCBpcyBOb25lOgogICAgICAgICAgICBob3N0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1faG9zdAogICAgICAgICAgICBwb3J0ID0gc2VsZi5zZXJ2ZXIudXBzdHJlYW1fcG9ydAoKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKCiAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDMwNykKICAgICAgICB1cmwgPSBmImh0dHA6Ly97aG9zdH06e3BvcnR9e3NlbGYucGF0aH0iCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgicmVkaXJlY3QgdG8gJXMiLCB1cmwpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiTG9jYXRpb24iLCB1cmwpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgc2VsZi53ZmlsZS53cml0ZShiIlJlZGlyZWN0ZWQiKQoKICAgIGRlZiB3cml0ZV9lcnJvcihzZWxmLCBkYXRhLCBjb250ZW50X2xlbmd0aD1Ob25lKToKICAgICAgICBpZiBjb250ZW50X2xlbmd0aCBpcyBOb25lOgogICAgICAgICAgICBjb250ZW50X2xlbmd0aCA9IGxlbihkYXRhKQogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIndyaXRlX2Vycm9yICVzIiwgZGF0YSkKICAgICAgICBzZWxmLnJlYWRfYWxsX2lucHV0KCkKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIoY29udGVudF9sZW5ndGgpKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3B1dF9vayhzZWxmKToKICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJmYWtlIHB1dCIpCgogICAgICAgIHNlbGYucmVhZF9hbGxfaW5wdXQoKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiRVRhZyIsICJiNTQzNTdmYWYwNjMyY2NlNDZlOTQyZmE2ODM1NmIzOCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCAwKQogICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQoKICAgIGRlZiBfZmFrZV91cGxvYWRzKHNlbGYsIHBhdGgsIHVwbG9hZF9pZCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8SW5pdGlhdGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPEJ1Y2tldD57YnVja2V0fTwvQnVja2V0PiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+IgogICAgICAgICAgICBmIjxVcGxvYWRJZD57dXBsb2FkX2lkfTwvVXBsb2FkSWQ+IgogICAgICAgICAgICAiPC9Jbml0aWF0ZU11bHRpcGFydFVwbG9hZFJlc3VsdD4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9mYWtlX3Bvc3Rfb2soc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5yZWFkX2FsbF9pbnB1dCgpCgogICAgICAgIHBhcnRzID0gW3ggZm9yIHggaW4gcGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYnVja2V0ID0gcGFydHNbMF0KICAgICAgICBrZXkgPSAiLyIuam9pbihwYXJ0c1sxOl0pCiAgICAgICAgbG9jYXRpb24gPSAiaHR0cDovL0V4YW1wbGUtQnVja2V0LnMzLlJlZ2lvbi5hbWF6b25hd3MuY29tLyIgKyBwYXRoCiAgICAgICAgZGF0YSA9ICgKICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+XG4nCiAgICAgICAgICAgICI8Q29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgICAgIGYiPExvY2F0aW9uPntsb2NhdGlvbn08L0xvY2F0aW9uPlxuIgogICAgICAgICAgICBmIjxCdWNrZXQ+e2J1Y2tldH08L0J1Y2tldD5cbiIKICAgICAgICAgICAgZiI8S2V5PntrZXl9PC9LZXk+XG4iCiAgICAgICAgICAgIGYnPEVUYWc+IjM4NThmNjIyMzBhYzNjOTE1ZjMwMGM2NjQzMTJjMTFmLTkiPC9FVGFnPlxuJwogICAgICAgICAgICBmIjwvQ29tcGxldGVNdWx0aXBhcnRVcGxvYWRSZXN1bHQ+XG4iCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQogICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCiAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBsZW4oZGF0YSkpCiAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCgogICAgICAgIHNlbGYud2ZpbGUud3JpdGUoYnl0ZXMoZGF0YSwgIlVURi04IikpCgogICAgZGVmIF9tb2NrX3NldHRpbmdzKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXRoID0gW3ggZm9yIHggaW4gcGFydHMucGF0aC5zcGxpdCgiLyIpIGlmIHhdCiAgICAgICAgYXNzZXJ0IHBhdGhbMF0gPT0gIm1vY2tfc2V0dGluZ3MiLCBwYXRoCiAgICAgICAgaWYgbGVuKHBhdGgpIDwgMjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfcGFydF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCA9IF9TZXJ2ZXJSdW50aW1lLkNvdW50QWZ0ZXIuZnJvbV9jZ2lfcGFyYW1zKAogICAgICAgICAgICAgICAgX3J1bnRpbWUubG9jaywgcGFyYW1zCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGF0X3BhcnRfdXBsb2FkICVzIiwgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImF0X29iamVjdF91cGxvYWQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkID0gX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoCiAgICAgICAgICAgICAgICBfcnVudGltZS5sb2NrLCBwYXJhbXMKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJzZXQgYXRfb2JqZWN0X3VwbG9hZCAlcyIsIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vaygpCgogICAgICAgIGlmIHBhdGhbMV0gPT0gImZha2VfcHV0cyI6CiAgICAgICAgICAgIHBhcmFtcyA9IHVybGxpYi5wYXJzZS5wYXJzZV9xcyhwYXJ0cy5xdWVyeSwga2VlcF9ibGFua192YWx1ZXM9RmFsc2UpCiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciA9IGludCgKICAgICAgICAgICAgICAgIHBhcmFtcy5nZXQoIndoZW5fbGVuZ3RoX2JpZ2dlciIsIFsxMDI0ICogMTAyNF0pWzBdCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IGZha2VfcHV0cyAlcyIsIF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAic2xvd19wdXQiOgogICAgICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQogICAgICAgICAgICBfcnVudGltZS5zbG93X3B1dCA9IF9TZXJ2ZXJSdW50aW1lLlNsb3dQdXQoCiAgICAgICAgICAgICAgICBsb2NrPV9ydW50aW1lLmxvY2ssCiAgICAgICAgICAgICAgICBtaW5pbWFsX2xlbmd0aF89X2FuZF90aGVuKHBhcmFtcy5nZXQoIm1pbmltYWxfbGVuZ3RoIiwgW05vbmVdKVswXSwgaW50KSwKICAgICAgICAgICAgICAgIHByb2JhYmlsaXR5Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgicHJvYmFiaWxpdHkiLCBbTm9uZV0pWzBdLCBmbG9hdCksCiAgICAgICAgICAgICAgICB0aW1lb3V0Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgidGltZW91dCIsIFtOb25lXSlbMF0sIGZsb2F0KSwKICAgICAgICAgICAgICAgIGNvdW50Xz1fYW5kX3RoZW4ocGFyYW1zLmdldCgiY291bnQiLCBbTm9uZV0pWzBdLCBpbnQpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInNldCBzbG93IHB1dCAlcyIsIF9ydW50aW1lLnNsb3dfcHV0KQogICAgICAgICAgICByZXR1cm4gc2VsZi5fb2soKQoKICAgICAgICBpZiBwYXRoWzFdID09ICJzZXR1cF9mYWtlX211bHRwYXJ0dXBsb2FkcyI6CiAgICAgICAgICAgIF9ydW50aW1lLmZha2VfbXVsdGlwYXJ0X3VwbG9hZCA9IFRydWUKICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2V0IHNldHVwX2Zha2VfbXVsdHBhcnR1cGxvYWRzIikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAiYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIjoKICAgICAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICAgICAgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkID0gKAogICAgICAgICAgICAgICAgX1NlcnZlclJ1bnRpbWUuQ291bnRBZnRlci5mcm9tX2NnaV9wYXJhbXMoX3J1bnRpbWUubG9jaywgcGFyYW1zKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAic2V0IGF0X2NyZWF0ZV9tdWx0aV9wYXJ0X3VwbG9hZCAlcyIsCiAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9jcmVhdGVfbXVsdGlfcGFydF91cGxvYWQsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgaWYgcGF0aFsxXSA9PSAicmVzZXQiOgogICAgICAgICAgICBfcnVudGltZS5yZXNldCgpCiAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoInJlc2V0IikKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29rKCkKCiAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVfZXJyb3IoIl9tb2NrX3NldHRpbmdzOiB3cm9uZyBjb21tYW5kIikKCiAgICBkZWYgZG9fR0VUKHNlbGYpOgogICAgICAgIGlmIHNlbGYucGF0aCA9PSAiLyI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9waW5nKCkKCiAgICAgICAgaWYgc2VsZi5wYXRoLnN0YXJ0c3dpdGgoIi9tb2NrX3NldHRpbmdzIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2NrX3NldHRpbmdzKCkKCiAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiZ2V0IHJlZGlyZWN0IikKICAgICAgICByZXR1cm4gc2VsZi5yZWRpcmVjdCgpCgogICAgZGVmIGRvX1BVVChzZWxmKToKICAgICAgICBjb250ZW50X2xlbmd0aCA9IGludChzZWxmLmhlYWRlcnMuZ2V0KCJDb250ZW50LUxlbmd0aCIsIDApKQoKICAgICAgICBpZiBfcnVudGltZS5zbG93X3B1dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGltZW91dCA9IF9ydW50aW1lLnNsb3dfcHV0LmdldF90aW1lb3V0KGNvbnRlbnRfbGVuZ3RoKQogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgic2xvdyBwdXQgJXMiLCB0aW1lb3V0KQogICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0KQoKICAgICAgICBwYXJ0cyA9IHVybGxpYi5wYXJzZS51cmxzcGxpdChzZWxmLnBhdGgpCiAgICAgICAgcGFyYW1zID0gdXJsbGliLnBhcnNlLnBhcnNlX3FzKHBhcnRzLnF1ZXJ5LCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KCiAgICAgICAgaWYgdXBsb2FkX2lkIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgInB1dCBhdF9wYXJ0X3VwbG9hZCAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICB1cGxvYWRfaWQsCiAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfcGFydF91cGxvYWQuaGFzX2VmZmVjdCgpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9wYXJ0X3VwbG9hZC5pbmplY3RfZXJyb3Ioc2VsZikKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuaXNfZmFrZV91cGxvYWQodXBsb2FkX2lkLCBwYXJ0cy5wYXRoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wdXRfb2soKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIF9ydW50aW1lLmF0X29iamVjdF91cGxvYWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGVycm9yX2F0X29iamVjdF91cGxvYWQgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuYXRfb2JqZWN0X3VwbG9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBfcnVudGltZS5hdF9vYmplY3RfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQogICAgICAgICAgICBpZiBfcnVudGltZS5mYWtlX3B1dF93aGVuX2xlbmd0aF9iaWdnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBjb250ZW50X2xlbmd0aCA+IF9ydW50aW1lLmZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlcjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKAogICAgICAgICAgICAgICAgICAgICAgICAicHV0IGZha2VfcHV0X3doZW5fbGVuZ3RoX2JpZ2dlciAlcywgJXMsICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgX3J1bnRpbWUuZmFrZV9wdXRfd2hlbl9sZW5ndGhfYmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3B1dF9vaygpCgogICAgICAgIHNlbGYubG9nX21lc3NhZ2UoCiAgICAgICAgICAgICJwdXQgcmVkaXJlY3QgJXMiLAogICAgICAgICAgICBwYXJ0cywKICAgICAgICApCiAgICAgICAgcmV0dXJuIHNlbGYucmVkaXJlY3QoKQoKICAgIGRlZiBkb19QT1NUKHNlbGYpOgogICAgICAgIHBhcnRzID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHNlbGYucGF0aCkKICAgICAgICBwYXJhbXMgPSB1cmxsaWIucGFyc2UucGFyc2VfcXMocGFydHMucXVlcnksIGtlZXBfYmxhbmtfdmFsdWVzPVRydWUpCiAgICAgICAgdXBsb2FkcyA9IHBhcmFtcy5nZXQoInVwbG9hZHMiLCBbTm9uZV0pWzBdCiAgICAgICAgaWYgdXBsb2FkcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaWYgX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmhhc19lZmZlY3QoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3J1bnRpbWUuYXRfY3JlYXRlX211bHRpX3BhcnRfdXBsb2FkLmluamVjdF9lcnJvcihzZWxmKQoKICAgICAgICAgICAgaWYgX3J1bnRpbWUuZmFrZV9tdWx0aXBhcnRfdXBsb2FkOgogICAgICAgICAgICAgICAgdXBsb2FkX2lkID0gZ2V0X3JhbmRvbV9zdHJpbmcoNSkKICAgICAgICAgICAgICAgIF9ydW50aW1lLnJlZ2lzdGVyX2Zha2VfdXBsb2FkKHVwbG9hZF9pZCwgcGFydHMucGF0aCkKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWtlX3VwbG9hZHMocGFydHMucGF0aCwgdXBsb2FkX2lkKQoKICAgICAgICB1cGxvYWRfaWQgPSBwYXJhbXMuZ2V0KCJ1cGxvYWRJZCIsIFtOb25lXSlbMF0KICAgICAgICBpZiBfcnVudGltZS5pc19mYWtlX3VwbG9hZCh1cGxvYWRfaWQsIHBhcnRzLnBhdGgpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFrZV9wb3N0X29rKHBhcnRzLnBhdGgpCgogICAgICAgIHJldHVybiBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fSEVBRChzZWxmKToKICAgICAgICBzZWxmLnJlZGlyZWN0KCkKCiAgICBkZWYgZG9fREVMRVRFKHNlbGYpOgogICAgICAgIHNlbGYucmVkaXJlY3QoKQoKCmNsYXNzIF9UaHJlYWRlZEhUVFBTZXJ2ZXIoc29ja2V0c2VydmVyLlRocmVhZGluZ01peEluLCBodHRwLnNlcnZlci5IVFRQU2VydmVyKToKICAgICIiIkhhbmRsZSByZXF1ZXN0cyBpbiBhIHNlcGFyYXRlIHRocmVhZC4iIiIKCiAgICBkZWYgc2V0X3Vwc3RyZWFtKHNlbGYsIHVwc3RyZWFtX2hvc3QsIHVwc3RyZWFtX3BvcnQpOgogICAgICAgIHNlbGYudXBzdHJlYW1faG9zdCA9IHVwc3RyZWFtX2hvc3QKICAgICAgICBzZWxmLnVwc3RyZWFtX3BvcnQgPSB1cHN0cmVhbV9wb3J0CgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGh0dHBkID0gX1RocmVhZGVkSFRUUFNlcnZlcigoIjAuMC4wLjAiLCBpbnQoc3lzLmFyZ3ZbMV0pKSwgUmVxdWVzdEhhbmRsZXIpCiAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDQ6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKHN5cy5hcmd2WzJdLCBzeXMuYXJndlszXSkKICAgIGVsc2U6CiAgICAgICAgaHR0cGQuc2V0X3Vwc3RyZWFtKCJtaW5pbzEiLCA5MDAxKQogICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCg== | base64 --decode > broken_s3.py'] (cluster.py:105, run_and_check) 2024-05-01 12:24:23 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:True nothrow:False cmd: ['python', 'broken_s3.py', '8083'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:23 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:23 [ 398 ] DEBUG : Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/'] (cluster.py:105, run_and_check) 2024-05-01 12:24:24 [ 398 ] DEBUG : Exitcode:7 (cluster.py:117, run_and_check) 2024-05-01 12:24:25 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:25 [ 398 ] DEBUG : Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/'] (cluster.py:105, run_and_check) 2024-05-01 12:24:25 [ 398 ] DEBUG : Stdout:OK (cluster.py:113, run_and_check) 2024-05-01 12:24:25 [ 398 ] DEBUG : broken_s3.py answered OK on attempt 2 (mock_servers.py:53, start_mock_servers) 2024-05-01 12:24:25 [ 398 ] INFO : Mock server broken_s3.py started (mock_servers.py:68, start_mock_servers) 2024-05-01 12:24:25 [ 398 ] DEBUG : http://172.16.10.5:9001 "GET /root?delimiter=&encoding-type=url&list-type=2&max-keys=1000&prefix=data%2F HTTP/1.1" 200 0 (connectionpool.py:546, _make_request) 2024-05-01 12:24:25 [ 398 ] INFO : list_objects (0): [] (test.py:123, list_objects) 2024-05-01 12:24:25 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/mock_settings/reset'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:25 [ 398 ] DEBUG : Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/mock_settings/reset'] (cluster.py:105, run_and_check) 2024-05-01 12:24:25 [ 398 ] DEBUG : Stdout:OK (cluster.py:113, run_and_check) ----------------------------- Captured stderr call ----------------------------- Executing query CREATE TABLE central_query_log ( control_plane_id UUID, pod_id LowCardinality(String), scrape_ts_microseconds DateTime64(6) CODEC(Delta(8), LZ4), event_date Date, event_time DateTime, payload Array(String), payload_01 String, payload_02 String, payload_03 String, payload_04 String, payload_05 String, payload_06 String, payload_07 String, payload_08 String, payload_09 String, payload_10 String, payload_11 String, payload_12 String, payload_13 String, payload_14 String, payload_15 String, payload_16 String, payload_17 String, payload_18 String, payload_19 String ) ENGINE=MergeTree() PARTITION BY toYYYYMM(event_date) ORDER BY (control_plane_id, e on node Executing query SYSTEM STOP MERGES central_query_log on node Executing query INSERT INTO central_query_log SELECT control_plane_id, pod_id, toStartOfHour(event_time) + toIntervalSecond(randUniform(0,60)) as scrape_ts_microseconds, toDate(event_time) as event_date, event_time, payload, payload[1] as payload_01, payload[2] as payload_02, payload[3] as payload_03, payload[4] as payload_04, payload[5] as payload_05, payload[6] as payload_06, payload[7] as payload_07, payload[8] as payload_08, payload[9] as payload_09, payload[10] as payload_10, payload[11] as payload_11, payload[12] as payload_12, payload[13] as payload_13, payload[14] as payload_14, payload[15] as payload_15, payload[16] as pay on node Executing query INSERT INTO central_query_log SELECT control_plane_id, pod_id, toStartOfHour(event_time) + toIntervalSecond(randUniform(0,60)) as scrape_ts_microseconds, toDate(event_time) as event_date, event_time, payload, payload[1] as payload_01, payload[2] as payload_02, payload[3] as payload_03, payload[4] as payload_04, payload[5] as payload_05, payload[6] as payload_06, payload[7] as payload_07, payload[8] as payload_08, payload[9] as payload_09, payload[10] as payload_10, payload[11] as payload_11, payload[12] as payload_12, payload[13] as payload_13, payload[14] as payload_14, payload[15] as payload_15, payload[16] as pay on node Executing query SYSTEM FLUSH LOGS on node Executing query SELECT memory_usage FROM system.query_log WHERE query_id='INSERT_INTO_TABLE_RANDOM_DATA_QUERY_ID_0' AND type='QueryFinish' on node Executing query SELECT memory_usage FROM system.query_log WHERE query_id='INSERT_INTO_TABLE_RANDOM_DATA_QUERY_ID_1' AND type='QueryFinish' on node run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/mock_settings/slow_put?minimal_length=1000&timeout=5&count=20'] Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/mock_settings/slow_put?minimal_length=1000&timeout=5&count=20'] Stdout:OK run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/mock_settings/setup_fake_multpartuploads?'] Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/mock_settings/setup_fake_multpartuploads?'] Stdout:OK Executing query INSERT INTO TABLE FUNCTION s3( 'http://resolver:8083/root/data/test-upload_{_partition_id}.csv.gz', 'minio', 'minio123', 'CSV', auto, 'gzip' ) PARTITION BY formatDateTime(subtractHours(toDateTime('2022-12-13 00:00:00'), 1),'%Y-%m-%d_%H:00') WITH toDateTime('2022-12-13 00:00:00') as time_point SELECT * FROM central_query_log WHERE event_date >= subtractDays(toDate(time_point), 1) AND scrape_ts_microseconds >= subtractHours(toStartOfHour(time_point), 12) AND scrape_ts_microseconds < toStartOfDay(time_point) SETTINGS s3_max_inflight_parts_for_one_file=1 on node Executing query SELECT count() FROM central_query_log on node Executing query WITH toDateTime('2022-12-13 00:00:00') as time_point SELECT count() FROM central_query_log WHERE event_date >= subtractDays(toDate(time_point), 1) AND scrape_ts_microseconds >= subtractHours(toStartOfHour(time_point), 12) AND scrape_ts_microseconds < toStartOfDay(time_point) on node Executing query SYSTEM FLUSH LOGS on node Executing query SELECT ProfileEvents FROM system.query_log WHERE query_id='INSERT_INTO_S3_FUNCTION_QUERY_ID' AND type='QueryFinish' on node Executing query SYSTEM FLUSH LOGS on node Executing query SELECT memory_usage FROM system.query_log WHERE query_id='INSERT_INTO_S3_FUNCTION_QUERY_ID' AND type='QueryFinish' on node ------------------------------ Captured log call ------------------------------- 2024-05-01 12:24:25 [ 398 ] DEBUG : Executing query CREATE TABLE central_query_log ( control_plane_id UUID, pod_id LowCardinality(String), scrape_ts_microseconds DateTime64(6) CODEC(Delta(8), LZ4), event_date Date, event_time DateTime, payload Array(String), payload_01 String, payload_02 String, payload_03 String, payload_04 String, payload_05 String, payload_06 String, payload_07 String, payload_08 String, payload_09 String, payload_10 String, payload_11 String, payload_12 String, payload_13 String, payload_14 String, payload_15 String, payload_16 String, payload_17 String, payload_18 String, payload_19 String ) ENGINE=MergeTree() PARTITION BY toYYYYMM(event_date) ORDER BY (control_plane_id, e on node (cluster.py:3423, query) 2024-05-01 12:24:25 [ 398 ] DEBUG : Executing query SYSTEM STOP MERGES central_query_log on node (cluster.py:3423, query) 2024-05-01 12:24:25 [ 398 ] DEBUG : Executing query INSERT INTO central_query_log SELECT control_plane_id, pod_id, toStartOfHour(event_time) + toIntervalSecond(randUniform(0,60)) as scrape_ts_microseconds, toDate(event_time) as event_date, event_time, payload, payload[1] as payload_01, payload[2] as payload_02, payload[3] as payload_03, payload[4] as payload_04, payload[5] as payload_05, payload[6] as payload_06, payload[7] as payload_07, payload[8] as payload_08, payload[9] as payload_09, payload[10] as payload_10, payload[11] as payload_11, payload[12] as payload_12, payload[13] as payload_13, payload[14] as payload_14, payload[15] as payload_15, payload[16] as pay on node (cluster.py:3423, query) 2024-05-01 12:24:27 [ 398 ] DEBUG : Executing query INSERT INTO central_query_log SELECT control_plane_id, pod_id, toStartOfHour(event_time) + toIntervalSecond(randUniform(0,60)) as scrape_ts_microseconds, toDate(event_time) as event_date, event_time, payload, payload[1] as payload_01, payload[2] as payload_02, payload[3] as payload_03, payload[4] as payload_04, payload[5] as payload_05, payload[6] as payload_06, payload[7] as payload_07, payload[8] as payload_08, payload[9] as payload_09, payload[10] as payload_10, payload[11] as payload_11, payload[12] as payload_12, payload[13] as payload_13, payload[14] as payload_14, payload[15] as payload_15, payload[16] as pay on node (cluster.py:3423, query) 2024-05-01 12:24:29 [ 398 ] DEBUG : Executing query SYSTEM FLUSH LOGS on node (cluster.py:3423, query) 2024-05-01 12:24:30 [ 398 ] DEBUG : Executing query SELECT memory_usage FROM system.query_log WHERE query_id='INSERT_INTO_TABLE_RANDOM_DATA_QUERY_ID_0' AND type='QueryFinish' on node (cluster.py:3423, query) 2024-05-01 12:24:31 [ 398 ] DEBUG : Executing query SELECT memory_usage FROM system.query_log WHERE query_id='INSERT_INTO_TABLE_RANDOM_DATA_QUERY_ID_1' AND type='QueryFinish' on node (cluster.py:3423, query) 2024-05-01 12:24:31 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/mock_settings/slow_put?minimal_length=1000&timeout=5&count=20'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:31 [ 398 ] DEBUG : Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/mock_settings/slow_put?minimal_length=1000&timeout=5&count=20'] (cluster.py:105, run_and_check) 2024-05-01 12:24:31 [ 398 ] DEBUG : Stdout:OK (cluster.py:113, run_and_check) 2024-05-01 12:24:31 [ 398 ] DEBUG : run container_id:roottestmergetrees3_resolver_1 detach:False nothrow:True cmd: ['curl', '-s', 'http://localhost:8083/mock_settings/setup_fake_multpartuploads?'] (cluster.py:2004, exec_in_container) 2024-05-01 12:24:31 [ 398 ] DEBUG : Command:['docker', 'exec', 'roottestmergetrees3_resolver_1', 'curl', '-s', 'http://localhost:8083/mock_settings/setup_fake_multpartuploads?'] (cluster.py:105, run_and_check) 2024-05-01 12:24:31 [ 398 ] DEBUG : Stdout:OK (cluster.py:113, run_and_check) 2024-05-01 12:24:31 [ 398 ] DEBUG : Executing query INSERT INTO TABLE FUNCTION s3( 'http://resolver:8083/root/data/test-upload_{_partition_id}.csv.gz', 'minio', 'minio123', 'CSV', auto, 'gzip' ) PARTITION BY formatDateTime(subtractHours(toDateTime('2022-12-13 00:00:00'), 1),'%Y-%m-%d_%H:00') WITH toDateTime('2022-12-13 00:00:00') as time_point SELECT * FROM central_query_log WHERE event_date >= subtractDays(toDate(time_point), 1) AND scrape_ts_microseconds >= subtractHours(toStartOfHour(time_point), 12) AND scrape_ts_microseconds < toStartOfDay(time_point) SETTINGS s3_max_inflight_parts_for_one_file=1 on node (cluster.py:3423, query) 2024-05-01 12:24:40 [ 398 ] DEBUG : Executing query SELECT count() FROM central_query_log on node (cluster.py:3423, query) 2024-05-01 12:24:41 [ 398 ] DEBUG : Executing query WITH toDateTime('2022-12-13 00:00:00') as time_point SELECT count() FROM central_query_log WHERE event_date >= subtractDays(toDate(time_point), 1) AND scrape_ts_microseconds >= subtractHours(toStartOfHour(time_point), 12) AND scrape_ts_microseconds < toStartOfDay(time_point) on node (cluster.py:3423, query) 2024-05-01 12:24:41 [ 398 ] DEBUG : Executing query SYSTEM FLUSH LOGS on node (cluster.py:3423, query) 2024-05-01 12:24:42 [ 398 ] DEBUG : Executing query SELECT ProfileEvents FROM system.query_log WHERE query_id='INSERT_INTO_S3_FUNCTION_QUERY_ID' AND type='QueryFinish' on node (cluster.py:3423, query) 2024-05-01 12:24:42 [ 398 ] DEBUG : Executing query SYSTEM FLUSH LOGS on node (cluster.py:3423, query) 2024-05-01 12:24:43 [ 398 ] DEBUG : Executing query SELECT memory_usage FROM system.query_log WHERE query_id='INSERT_INTO_S3_FUNCTION_QUERY_ID' AND type='QueryFinish' on node (cluster.py:3423, query) =============================== warnings summary =============================== test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries /usr/local/lib/python3.10/dist-packages/_pytest/threadexception.py:73: PytestUnhandledThreadExceptionWarning: Exception in thread Thread-42 (attack) Traceback (most recent call last): File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner self.run() File "/usr/lib/python3.10/threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "/ClickHouse/tests/integration/test_postgresql_replica_database_engine_1/test.py", line 427, in attack cursor.execute(query_pool[query_id].format(table_id)) NameError: name 'cursor' is not defined warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg)) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ============================== slowest durations =============================== 269.89s call test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node] 144.37s call test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk] 96.23s call test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node] 64.34s call test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table 61.99s call test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node] 57.03s call test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader 42.79s call test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication 42.00s setup test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table 39.74s call test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication 39.62s call test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions 34.91s call test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 32.88s setup test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility 32.64s setup test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams 32.17s setup test_merge_tree_load_parts/test.py::test_merge_tree_load_parts 31.52s setup test_merge_tree_s3/test.py::test_alter_table_columns[node] 23.63s teardown test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table 23.12s teardown test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1] 22.31s teardown test_postgresql_protocol/test.py::test_python_client 22.18s teardown test_merge_tree_s3/test.py::test_table_manipulations[node] 21.30s call test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished 21.20s setup test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node 20.86s call test_merge_tree_load_parts/test.py::test_merge_tree_load_parts 20.75s call test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility 20.45s call test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries 19.31s setup test_postgresql_protocol/test.py::test_java_client 18.97s call test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished 18.87s call test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node] 18.79s setup test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication 18.56s call test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart 18.51s setup test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2] 17.54s setup test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader 16.81s setup test_quota/test.py::test_add_remove_interval 16.45s setup test_keeper_persistent_log_multinode/test.py::test_restart_multinode 16.42s setup test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 16.05s setup test_partition/test.py::test_attach_check_all_parts 15.49s call test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node] 15.48s call test_postgresql_replica_database_engine_1/test.py::test_replicating_dml 15.36s call test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted 15.30s setup test_reloading_settings_from_users_xml/test.py::test_force_reload 14.90s setup test_log_levels_update/test.py::test_log_levels_update 13.88s teardown test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 13.85s call test_postgresql_replica_database_engine_1/test.py::test_single_transaction 13.78s teardown test_partition/test.py::test_system_detached_parts 13.54s teardown test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader 13.43s call test_postgresql_replica_database_engine_1/test.py::test_multiple_databases 13.31s setup test_library_bridge/test_exiled.py::test_bridge_dies_with_parent 13.30s call test_keeper_persistent_log_multinode/test.py::test_restart_multinode 12.81s call test_partition/test.py::test_system_detached_parts 12.63s setup test_render_log_file_name_templates/test.py::test_check_file_names 12.09s call test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables 11.36s call test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots 10.41s setup test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node] 10.22s call test_library_bridge/test_exiled.py::test_bridge_dies_with_parent 10.03s setup test_keeper_secure_client/test.py::test_connection 8.99s call test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes 8.04s teardown test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility 7.54s call test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node] 7.40s call test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node] 6.41s call test_quota/test.py::test_add_remove_interval 6.39s call test_postgresql_replica_database_engine_1/test.py::test_different_data_types 6.09s call test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree 5.93s teardown test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed 5.48s call test_quota/test.py::test_add_remove_quota 5.25s call test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams 5.23s call test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables 5.23s teardown test_keeper_secure_client/test.py::test_connection 5.22s call test_partition/test.py::test_make_clone_in_detached 5.19s call test_quota/test.py::test_dcl_introspection 5.17s call test_merge_tree_s3/test.py::test_attach_detach_partition[node] 5.11s call test_quota/test.py::test_dcl_management 4.98s call test_merge_tree_s3/test.py::test_alter_table_columns[node] 4.80s call test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where 4.67s call test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node] 4.60s call test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout 4.47s call test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node] 4.24s teardown test_log_levels_update/test.py::test_log_levels_update 4.10s teardown test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error 4.07s teardown test_render_log_file_name_templates/test.py::test_check_file_names 3.86s call test_merge_tree_s3/test.py::test_table_manipulations[node] 3.79s teardown test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree 3.79s teardown test_quota/test.py::test_users_xml_is_readonly 3.73s call test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1] 3.62s call test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2] 3.56s call test_log_levels_update/test.py::test_log_levels_update 3.32s call test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node] 3.06s call test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node] 3.01s teardown test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout 3.00s call test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2] 2.98s call test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index 2.95s call test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where 2.92s call test_quota/test.py::test_exceed_quota 2.82s call test_partition/test.py::test_drop_detached_parts 2.80s call test_partition/test.py::test_detached_part_dir_exists 2.74s teardown test_postgresql_replica_database_engine_1/test.py::test_virtual_columns 2.73s call test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1] 2.72s call test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value 2.70s call test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part] 2.60s call test_merge_tree_s3/test.py::test_freeze_unfreeze[node] 2.56s call test_partition/test.py::test_attach_check_all_parts 2.48s teardown test_keeper_persistent_log_multinode/test.py::test_restart_multinode 2.41s call test_quota/test.py::test_query_inserts 2.29s call test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3] 2.28s call test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node] 2.16s teardown test_library_bridge/test_exiled.py::test_bridge_dies_with_parent 2.04s call test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node] 2.02s call test_quota/test.py::test_reload_users_xml_by_timer 1.98s call test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node] 1.94s call test_quota/test.py::test_tracking_quota 1.93s call test_quota/test.py::test_quota_from_users_xml 1.90s call test_partition/test.py::test_partition_complex 1.90s call test_postgresql_replica_database_engine_1/test.py::test_virtual_columns 1.78s call test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout 1.71s call test_reloading_settings_from_users_xml/test.py::test_force_reload 1.60s teardown test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions 1.59s call test_quota/test.py::test_simpliest_quota 1.57s call test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int 1.46s call test_postgresql_replica_database_engine_1/test.py::test_quoting_1 1.44s teardown test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication 1.41s call test_postgresql_replica_database_engine_1/test.py::test_quoting_2 1.36s setup test_quota/test.py::test_query_inserts 1.29s setup test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node] 1.28s teardown test_postgresql_replica_database_engine_1/test.py::test_multiple_databases 1.26s teardown test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication 1.22s call test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node 1.17s setup test_quota/test.py::test_consumption_of_show_clusters 1.17s call test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum 1.16s call test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload 1.13s setup test_partition/test.py::test_drop_detached_parts 0.97s setup test_quota/test.py::test_users_xml_is_readonly 0.96s setup test_quota/test.py::test_consumption_of_show_databases 0.95s setup test_quota/test.py::test_dcl_management 0.93s setup test_partition/test.py::test_system_detached_parts 0.92s setup test_quota/test.py::test_simpliest_quota 0.92s setup test_quota/test.py::test_reload_users_xml_by_timer 0.88s setup test_quota/test.py::test_consumption_of_show_processlist 0.87s setup test_quota/test.py::test_quota_from_users_xml 0.86s setup test_quota/test.py::test_dcl_introspection 0.86s setup test_quota/test.py::test_consumption_of_show_tables 0.83s teardown test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished 0.83s setup test_quota/test.py::test_exceed_quota 0.83s setup test_quota/test.py::test_tracking_quota 0.82s teardown test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart 0.81s setup test_quota/test.py::test_add_remove_quota 0.81s setup test_quota/test.py::test_consumption_of_show_privileges 0.81s setup test_partition/test.py::test_partition_simple 0.76s setup test_partition/test.py::test_partition_complex 0.76s teardown test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables 0.76s teardown test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value 0.73s teardown test_postgresql_replica_database_engine_1/test.py::test_single_transaction 0.73s teardown test_postgresql_replica_database_engine_1/test.py::test_replicating_dml 0.72s teardown test_postgresql_replica_database_engine_1/test.py::test_quoting_2 0.71s teardown test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes 0.71s teardown test_postgresql_replica_database_engine_1/test.py::test_quoting_1 0.71s teardown test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables 0.71s teardown test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries 0.71s teardown test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index 0.70s call test_partition/test.py::test_cannot_attach_active_part 0.69s call test_postgresql_protocol/test.py::test_java_client 0.68s call test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed 0.63s call test_postgresql_protocol/test.py::test_psql_client 0.55s teardown test_postgresql_replica_database_engine_1/test.py::test_different_data_types 0.55s call test_merge_tree_s3/test.py::test_s3_no_delete_objects[node] 0.55s teardown test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots 0.55s teardown test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished 0.55s setup test_partition/test.py::test_cannot_attach_active_part 0.54s call test_quota/test.py::test_consumption_of_show_clusters 0.50s call test_partition/test.py::test_partition_simple 0.48s call test_quota/test.py::test_consumption_of_show_privileges 0.48s call test_quota/test.py::test_consumption_of_show_processlist 0.43s call test_quota/test.py::test_consumption_of_show_tables 0.43s call test_quota/test.py::test_consumption_of_show_databases 0.43s setup test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout 0.40s setup test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload 0.38s call test_render_log_file_name_templates/test.py::test_check_file_names 0.37s setup test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout 0.37s setup test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int 0.37s setup test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum 0.33s teardown test_partition/test.py::test_attach_check_all_parts 0.33s teardown test_partition/test.py::test_drop_detached_parts 0.27s call test_quota/test.py::test_users_xml_is_readonly 0.22s call test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error 0.22s call test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node] 0.22s call test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node] 0.22s call test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node] 0.22s call test_keeper_secure_client/test.py::test_connection 0.17s teardown test_partition/test.py::test_partition_simple 0.17s teardown test_partition/test.py::test_partition_complex 0.17s teardown test_partition/test.py::test_cannot_attach_active_part 0.13s call test_postgresql_protocol/test.py::test_python_client 0.10s setup test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node] 0.09s setup test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node] 0.08s setup test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part] 0.08s setup test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node] 0.07s setup test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node] 0.07s setup test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node] 0.07s setup test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3] 0.00s setup test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node] 0.00s setup test_merge_tree_s3/test.py::test_table_manipulations[node] 0.00s setup test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node] 0.00s setup test_merge_tree_s3/test.py::test_s3_no_delete_objects[node] 0.00s setup test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node] 0.00s setup test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node] 0.00s setup test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node] 0.00s setup test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node] 0.00s setup test_merge_tree_s3/test.py::test_freeze_unfreeze[node] 0.00s setup test_merge_tree_s3/test.py::test_attach_detach_partition[node] 0.00s setup test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node] 0.00s setup test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node] 0.00s setup test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node] 0.00s setup test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk] 0.00s setup test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node] 0.00s teardown test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart 0.00s teardown test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_quoting_2 0.00s teardown test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_multiple_databases 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index 0.00s setup test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1] 0.00s teardown test_merge_tree_s3/test.py::test_alter_table_columns[node] 0.00s teardown test_merge_tree_load_parts/test.py::test_merge_tree_load_parts 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes 0.00s setup test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1] 0.00s setup test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where 0.00s setup test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication 0.00s teardown test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_single_transaction 0.00s teardown test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2] 0.00s teardown test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables 0.00s setup test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed 0.00s teardown test_merge_tree_s3/test.py::test_s3_no_delete_objects[node] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries 0.00s teardown test_partition/test.py::test_make_clone_in_detached 0.00s teardown test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node] 0.00s teardown test_quota/test.py::test_dcl_management 0.00s teardown test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_quoting_1 0.00s teardown test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_replicating_dml 0.00s teardown test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node] 0.00s teardown test_quota/test.py::test_add_remove_interval 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_virtual_columns 0.00s teardown test_reloading_settings_from_users_xml/test.py::test_force_reload 0.00s setup test_postgresql_protocol/test.py::test_psql_client 0.00s teardown test_quota/test.py::test_consumption_of_show_clusters 0.00s setup test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error 0.00s teardown test_quota/test.py::test_quota_from_users_xml 0.00s teardown test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node] 0.00s teardown test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node] 0.00s teardown test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node] 0.00s teardown test_quota/test.py::test_reload_users_xml_by_timer 0.00s teardown test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_different_data_types 0.00s teardown test_postgresql_protocol/test.py::test_java_client 0.00s teardown test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload 0.00s teardown test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished 0.00s setup test_partition/test.py::test_detached_part_dir_exists 0.00s teardown test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node] 0.00s setup test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value 0.00s teardown test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node] 0.00s teardown test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node] 0.00s teardown test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part] 0.00s teardown test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node] 0.00s teardown test_quota/test.py::test_add_remove_quota 0.00s teardown test_quota/test.py::test_dcl_introspection 0.00s teardown test_quota/test.py::test_simpliest_quota 0.00s teardown test_quota/test.py::test_query_inserts 0.00s teardown test_quota/test.py::test_exceed_quota 0.00s teardown test_quota/test.py::test_consumption_of_show_privileges 0.00s teardown test_partition/test.py::test_detached_part_dir_exists 0.00s teardown test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum 0.00s teardown test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node] 0.00s teardown test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node] 0.00s teardown test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node] 0.00s setup test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where 0.00s setup test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree 0.00s teardown test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node] 0.00s setup test_partition/test.py::test_make_clone_in_detached 0.00s teardown test_quota/test.py::test_tracking_quota 0.00s teardown test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where 0.00s teardown test_merge_tree_s3/test.py::test_attach_detach_partition[node] 0.00s teardown test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node] 0.00s teardown test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int 0.00s setup test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted 0.00s teardown test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3] 0.00s teardown test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1] 0.00s setup test_postgresql_protocol/test.py::test_python_client 0.00s teardown test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout 0.00s teardown test_merge_tree_s3/test.py::test_freeze_unfreeze[node] 0.00s teardown test_quota/test.py::test_consumption_of_show_processlist 0.00s teardown test_quota/test.py::test_consumption_of_show_databases 0.00s teardown test_quota/test.py::test_consumption_of_show_tables 0.00s teardown test_postgresql_protocol/test.py::test_psql_client =========================== short test summary info ============================ FAILED test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node] PASSED test_reloading_settings_from_users_xml/test.py::test_force_reload PASSED test_partition/test.py::test_attach_check_all_parts PASSED test_postgresql_protocol/test.py::test_java_client PASSED test_partition/test.py::test_cannot_attach_active_part PASSED test_postgresql_protocol/test.py::test_psql_client PASSED test_postgresql_protocol/test.py::test_python_client PASSED test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout PASSED test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2] PASSED test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node PASSED test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed PASSED test_partition/test.py::test_detached_part_dir_exists PASSED test_quota/test.py::test_add_remove_interval PASSED test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum PASSED test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int PASSED test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1] PASSED test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload PASSED test_partition/test.py::test_drop_detached_parts PASSED test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2] PASSED test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout PASSED test_quota/test.py::test_add_remove_quota PASSED test_quota/test.py::test_consumption_of_show_clusters PASSED test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1] PASSED test_quota/test.py::test_consumption_of_show_databases PASSED test_partition/test.py::test_make_clone_in_detached PASSED test_quota/test.py::test_consumption_of_show_privileges PASSED test_quota/test.py::test_consumption_of_show_processlist PASSED test_partition/test.py::test_partition_complex PASSED test_merge_tree_s3/test.py::test_alter_table_columns[node] PASSED test_quota/test.py::test_consumption_of_show_tables PASSED test_partition/test.py::test_partition_simple PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where PASSED test_merge_tree_s3/test.py::test_attach_detach_partition[node] PASSED test_quota/test.py::test_dcl_introspection PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where PASSED test_quota/test.py::test_dcl_management PASSED test_partition/test.py::test_system_detached_parts PASSED test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree PASSED test_quota/test.py::test_exceed_quota PASSED test_merge_tree_load_parts/test.py::test_merge_tree_load_parts PASSED test_library_bridge/test_exiled.py::test_bridge_dies_with_parent PASSED test_quota/test.py::test_query_inserts PASSED test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication PASSED test_keeper_persistent_log_multinode/test.py::test_restart_multinode PASSED test_quota/test.py::test_quota_from_users_xml PASSED test_quota/test.py::test_reload_users_xml_by_timer PASSED test_quota/test.py::test_simpliest_quota PASSED test_quota/test.py::test_tracking_quota PASSED test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted PASSED test_quota/test.py::test_users_xml_is_readonly PASSED test_render_log_file_name_templates/test.py::test_check_file_names PASSED test_keeper_secure_client/test.py::test_connection PASSED test_log_levels_update/test.py::test_log_levels_update PASSED test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 PASSED test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication PASSED test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value PASSED test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart PASSED test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility PASSED test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions PASSED test_postgresql_replica_database_engine_1/test.py::test_different_data_types PASSED test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader PASSED test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table PASSED test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk] PASSED test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node] PASSED test_merge_tree_s3/test.py::test_freeze_unfreeze[node] PASSED test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished PASSED test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables PASSED test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables PASSED test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node] PASSED test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node] PASSED test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries PASSED test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node] PASSED test_postgresql_replica_database_engine_1/test.py::test_multiple_databases PASSED test_postgresql_replica_database_engine_1/test.py::test_quoting_1 PASSED test_postgresql_replica_database_engine_1/test.py::test_quoting_2 PASSED test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index PASSED test_postgresql_replica_database_engine_1/test.py::test_replicating_dml PASSED test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished PASSED test_postgresql_replica_database_engine_1/test.py::test_single_transaction PASSED test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes PASSED test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots PASSED test_postgresql_replica_database_engine_1/test.py::test_virtual_columns PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part] PASSED test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node] PASSED test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node] PASSED test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node] PASSED test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node] PASSED test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node] PASSED test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node] PASSED test_merge_tree_s3/test.py::test_s3_no_delete_objects[node] PASSED test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node] PASSED test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node] PASSED test_merge_tree_s3/test.py::test_table_manipulations[node] SKIPPED [1] test_merge_tree_load_parts/test.py:209: Skip with debug build and sanitizers. This test intentionally triggers LOGICAL_ERROR which leads to crash with those builds SKIPPED [3] test_merge_tree_s3/test.py:861: Disabled for sanitizers ======== 1 failed, 95 passed, 4 skipped, 1 warning in 733.89s (0:12:13) ======== Traceback (most recent call last): File "/home/ubuntu/_work/_temp/test/git-repo-copy/tests/integration/./runner", line 455, in subprocess.check_call(cmd, shell=True) File "/usr/lib/python3.10/subprocess.py", line 369, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command 'docker run --rm --name clickhouse_integration_tests_5g4oxp --privileged --dns-search='.' --volume=/home/ubuntu/_work/_temp/test/build/clickhouse-odbc-bridge:/clickhouse-odbc-bridge --volume=/home/ubuntu/_work/_temp/test/build/clickhouse:/clickhouse --volume=/home/ubuntu/_work/_temp/test/build/clickhouse-library-bridge:/clickhouse-library-bridge --volume=/home/ubuntu/_work/_temp/test/git-repo-copy/programs/server:/clickhouse-config --volume=/home/ubuntu/_work/_temp/test/git-repo-copy/tests/integration:/ClickHouse/tests/integration --volume=/home/ubuntu/_work/_temp/test/git-repo-copy/src/Server/grpc_protos:/ClickHouse/src/Server/grpc_protos --volume=/run:/run/host:ro --mount type=bind,source=/home/ubuntu/_work/_temp/test/dockerd_volume_dir,target=/var/lib/docker -e DOCKER_HELPER_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_BASE_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_KERBERIZED_HADOOP_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_KERBEROS_KDC_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_GOLANG_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_JAVA_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_JS_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_MYSQL_PHP_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_NGINX_DAV_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_POSTGRESQL_JAVA_CLIENT_TAG=0-8e9be16153250c8307730c9b88c8517181f494ce -e DOCKER_CLIENT_TIMEOUT=300 -e COMPOSE_HTTP_TIMEOUT=600 -e PYTHONUNBUFFERED=1 -e PYTEST_ADDOPTS="--dist=loadfile -n 10 -rfEps --run-id=0 --color=no --durations=0 test_keeper_persistent_log_multinode/test.py::test_restart_multinode test_keeper_reconfig_remove/test.py::test_reconfig_remove_followers_from_3 test_keeper_reconfig_remove_many/test.py::test_reconfig_remove_2_and_leader test_keeper_secure_client/test.py::test_connection test_library_bridge/test_exiled.py::test_bridge_dies_with_parent test_log_levels_update/test.py::test_log_levels_update test_merge_tree_load_parts/test.py::test_merge_tree_load_parts test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_corrupted test_merge_tree_load_parts/test.py::test_merge_tree_load_parts_filesystem_error 'test_merge_tree_s3/test.py::test_alter_table_columns[node]' 'test_merge_tree_s3/test.py::test_attach_detach_partition[node]' 'test_merge_tree_s3/test.py::test_cache_with_full_disk_space[node_with_limited_disk]' 'test_merge_tree_s3/test.py::test_freeze_system_unfreeze[node]' 'test_merge_tree_s3/test.py::test_freeze_unfreeze[node]' 'test_merge_tree_s3/test.py::test_heavy_insert_select_check_memory[node]' 'test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[False-node]' 'test_merge_tree_s3/test.py::test_insert_same_partition_and_merge[True-node]' 'test_merge_tree_s3/test.py::test_lazy_seek_optimization_for_async_read[node]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_drop[node]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors[node-broken_s3_always_multi_part]' 'test_merge_tree_s3/test.py::test_merge_canceled_by_s3_errors_when_move[node]' 'test_merge_tree_s3/test.py::test_move_partition_to_another_disk[node]' 'test_merge_tree_s3/test.py::test_move_replace_partition_to_another_table[node]' 'test_merge_tree_s3/test.py::test_s3_disk_apply_new_settings[node]' 'test_merge_tree_s3/test.py::test_s3_disk_heavy_write_check_mem[node]' 'test_merge_tree_s3/test.py::test_s3_disk_reads_on_unstable_connection[node]' 'test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory0-node]' 'test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory1-node]' 'test_merge_tree_s3/test.py::test_s3_engine_heavy_write_check_mem[in_flight_memory2-node]' 'test_merge_tree_s3/test.py::test_s3_no_delete_objects[node]' 'test_merge_tree_s3/test.py::test_simple_insert_select[0-16-node]' 'test_merge_tree_s3/test.py::test_simple_insert_select[8192-12-node]' 'test_merge_tree_s3/test.py::test_table_manipulations[node]' 'test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[0-4-2]' 'test_merge_tree_s3_with_cache/test.py::test_read_after_cache_is_wiped[8192-2-1]' 'test_merge_tree_s3_with_cache/test.py::test_write_is_cached[0-2]' 'test_merge_tree_s3_with_cache/test.py::test_write_is_cached[8192-1]' test_mutations_in_partitions_of_merge_tree/test.py::test_mutation_max_streams test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_with_where test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_merge_tree_without_where test_mutations_in_partitions_of_merge_tree/test.py::test_trivial_alter_in_partition_replicated_merge_tree test_partition/test.py::test_attach_check_all_parts test_partition/test.py::test_cannot_attach_active_part test_partition/test.py::test_detached_part_dir_exists test_partition/test.py::test_drop_detached_parts test_partition/test.py::test_make_clone_in_detached test_partition/test.py::test_partition_complex test_partition/test.py::test_partition_simple test_partition/test.py::test_system_detached_parts test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_single_node test_peak_memory_usage/test.py::test_clickhouse_client_max_peak_memory_usage_distributed test_postgresql_protocol/test.py::test_java_client test_postgresql_protocol/test.py::test_psql_client test_postgresql_protocol/test.py::test_python_client test_postgresql_replica_database_engine_1/test.py::test_abrupt_connection_loss_while_heavy_replication test_postgresql_replica_database_engine_1/test.py::test_abrupt_server_restart_while_heavy_replication test_postgresql_replica_database_engine_1/test.py::test_changing_replica_identity_value test_postgresql_replica_database_engine_1/test.py::test_clickhouse_restart test_postgresql_replica_database_engine_1/test.py::test_concurrent_transactions test_postgresql_replica_database_engine_1/test.py::test_different_data_types test_postgresql_replica_database_engine_1/test.py::test_drop_database_while_replication_startup_not_finished test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_all_database_tables test_postgresql_replica_database_engine_1/test.py::test_load_and_sync_subset_of_database_tables test_postgresql_replica_database_engine_1/test.py::test_many_concurrent_queries test_postgresql_replica_database_engine_1/test.py::test_multiple_databases test_postgresql_replica_database_engine_1/test.py::test_quoting_1 test_postgresql_replica_database_engine_1/test.py::test_quoting_2 test_postgresql_replica_database_engine_1/test.py::test_replica_identity_index test_postgresql_replica_database_engine_1/test.py::test_replicating_dml test_postgresql_replica_database_engine_1/test.py::test_restart_server_while_replication_startup_not_finished test_postgresql_replica_database_engine_1/test.py::test_single_transaction test_postgresql_replica_database_engine_1/test.py::test_table_schema_changes test_postgresql_replica_database_engine_1/test.py::test_user_managed_slots test_postgresql_replica_database_engine_1/test.py::test_virtual_columns test_quota/test.py::test_add_remove_interval test_quota/test.py::test_add_remove_quota test_quota/test.py::test_consumption_of_show_clusters test_quota/test.py::test_consumption_of_show_databases test_quota/test.py::test_consumption_of_show_privileges test_quota/test.py::test_consumption_of_show_processlist test_quota/test.py::test_consumption_of_show_tables test_quota/test.py::test_dcl_introspection test_quota/test.py::test_dcl_management test_quota/test.py::test_exceed_quota test_quota/test.py::test_query_inserts test_quota/test.py::test_quota_from_users_xml test_quota/test.py::test_reload_users_xml_by_timer test_quota/test.py::test_simpliest_quota test_quota/test.py::test_tracking_quota test_quota/test.py::test_users_xml_is_readonly test_reloading_settings_from_users_xml/test.py::test_force_reload test_reloading_settings_from_users_xml/test.py::test_reload_on_timeout test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_enum test_reloading_settings_from_users_xml/test.py::test_unexpected_setting_int test_reloading_settings_from_users_xml/test.py::test_unknown_setting_force_reload test_reloading_settings_from_users_xml/test.py::test_unknown_setting_reload_on_timeout test_render_log_file_name_templates/test.py::test_check_file_names test_replicated_merge_tree_compatibility/test.py::test_replicated_merge_tree_defaults_compatibility test_replicated_merge_tree_s3_zero_copy/test.py::test_drop_table -vvv" altinityinfra/integration-tests-runner:0-8e9be16153250c8307730c9b88c8517181f494ce ' returned non-zero exit status 1.